http2/http1.1代理如何处理传输编码?

13

HTTP/2禁止使用连接特定的头字段。以下标头字段不得出现:"Connection","Keep-Alive","Proxy-Connection","Transfer-Encoding"和"Upgrade"。此外,"TE"标头字段不能包含任何值,而只能是"trailers"。

我的问题是,由于HTTP/2禁止使用Transfer-Encoding头字段,因此HTTP/2代理如何处理Transfer-Encoding: chunked头?

代理是否应始终将整个分块请求缓存在内存中,并添加Content-Length标头,然后发送到HTTP/2服务器/客户端?


我发现有人也问了这个问题:https://lists.w3.org/Archives/Public/ietf-http-wg/2015JanMar/0144.html#start144 - alpha
1个回答

23
在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)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接