在HTTP/2中,内容总是“分块”的,因为它会被发送在DATA帧中,即携带块长度以及结束流标志的字节块。
在HTTP/2到HTTP/1.1代理中,代理有几个选择。
一个非常简单的情况是将每个收到的HTTP/2 DATA帧重新映射并以HTTP/1.1块发送出去。
因此,代理将必须在通信的HTTP/1.1端添加 Transfer-Encoding: chunked
头。
类似地,它可以将每个读取的内容重新映射成一个DATA帧(与等待/缓冲整个块相反,如果它很大)。
另一种情况是缓冲一些接收到的DATA帧,希望其中一个帧设置了流结束标志。
如果发生这种情况,则知道整个内容长度,并且代理可以添加 Content-Length
头并一次性发送整个内容。
同样在前面的情况下,当缓冲区溢出时,代理可以添加 Transfer-Encoding: chunked
头并发送大小等于缓冲区大小的块(而不是像第一种情况那样大小为DATA帧的大小)。
当代理接收到最后一个DATA帧时,它会对剩余的字节进行分块,然后发送终止块(信号块长度为零,表示块结束)。
在另一个方向上,即HTTP/1.1到HTTP/2,当代理接收到分块内容时,它可以简单地丢弃 Transfer-Encoding: chunked
头,将接收到的块制作成DATA帧,并发送该帧。
最终,它将接收到终止块(信号块长度为零,表示块结束),并将其转换为长度为零且设置了流结束标志的数据帧。
当然,如果代理执行了某些缓冲或其他优化,则DATA帧大小可能不完全等于块大小。
由于HTTP/2接收/发送包含结束流标志的数据帧(DATA frames),代理可以很容易地将其翻译为/从HTTP/1.1进行映射,将结束流(DATA frame)映射到终端块(terminal chunk),将终端块映射到结束流(DATA frame)。