2015-04-07 38 views
2

HTTP/2禁止连接特定的标题字段。以下标题字段不能出现:“连接”,“保持活动”,“代理连接”,“传输编码”和“升级”。此外,“TE”标题字段不得包含“拖车”以外的任何值。http2/http1.1代理如何处理Transfer-Encoding?

我想问的是,由于HTTP/2禁止Transfer-Encoding标头,所以HTTP/2代理如何处理标头Tranfer-Encoding:chunked?

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

+0

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

回答

4

在HTTP/2中,内容总是被“分块”,因为它在DATA帧中被发送,即,包含块长度的字节块以及如果帧是最后一个帧的信号结束标志。

在HTTP/2到HTTP/1.1代理中,代理有几个选择。

一个非常简单的情况是重新映射每个HTTP/2收到的数据帧并将其作为HTTP/1.1块发送出去。 因此,代理将不得不将Transfer-Encoding: chunked标头添加到通信的HTTP/1.1端。 类似地,它可以将每个内容读取重新映射到数据帧(而不是整个块的等待/缓冲区,如果它是大的话)。

另一种情况是缓冲一些接收到的数据帧,希望其中一个具有流结束标志设置。 如果发生这种情况,则整个内容长度是已知的,并且代理可以添加头文件并一次发送整个内容。

同样在前面的情况下,当缓冲区溢出时,代理服务器可以添加Transfer-Encoding: chunked标头并发送一个块大小为缓冲区的大小(而不是像第一种情况那样的数据帧的大小)。

当代理接收到最后一个数据帧时,它将剩余的字节组块化,然后发送终端块(用于表示块的结尾的零长度块)。在另一个方向上,HTTP/1.1到HTTP/2,当代理接收到分块的内容时,它可以简单地丢弃头,从接收的块中取出一个DATA帧,并发送该帧。 最终,它将收到终端块(用于表示块结尾的零长度块),并将其转换为长度为零的DATA帧,并设置流结束标志。

当然,如果代理执行一些缓冲或其他优化,DATA帧大小可能不完全等于块大小。

由于HTTP/2接收/发送包含流结束标志的数据帧,代理可以很容易地转换到/来自HTTP/1.1,将流结束数据帧映射到终端块和终端块到流结束DATA帧。

+0

听起来不错。很感谢。 – alpha