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

http2/http1.1代理如何处理传输编码?,http,proxy,http2,Http,Proxy,Http2,HTTP/2禁止特定于连接的头字段。不得出现以下标题字段:“连接”、“保持活动”、“代理连接”、“传输编码”和“升级”。此外,“TE”标题字段不得包含除“拖车”以外的任何值 我想问的是,既然HTTP/2禁止传输编码头,那么HTTP/2代理如何处理头传输编码:chunked 代理是否应始终将整个分块请求缓存在内存中,并添加内容长度头,发送到HTTP/2服务器/客户端?在HTTP/2中,内容始终是“分块”的,因为它是在数据帧中发送的,即,携带块长度的字节块以及指示帧是否是最后一帧的流结束标志 在HT

HTTP/2禁止特定于连接的头字段。不得出现以下标题字段:“连接”、“保持活动”、“代理连接”、“传输编码”和“升级”。此外,“TE”标题字段不得包含除“拖车”以外的任何值

我想问的是,既然HTTP/2禁止传输编码头,那么HTTP/2代理如何处理头传输编码:chunked


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

在HTTP/2中,内容始终是“分块”的,因为它是在数据帧中发送的,即,携带块长度的字节块以及指示帧是否是最后一帧的流结束标志

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

一个非常简单的例子是重新映射每个HTTP/2接收到的数据帧,并将其作为HTTP/1.1块发送出去。 因此,代理必须将
传输编码:chunked
头添加到通信的HTTP/1.1端。 类似地,它可以将读取的每个内容重新映射到一个数据帧中(而不是等待/缓冲整个块(如果它很大)

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

同样在前一种情况下,当缓冲区溢出时,代理可以添加
传输编码:chunked
头并发送一个缓冲区大小的块(而不是第一种情况下的数据帧大小)

当代理接收到最后一个数据帧时,它将剩余字节分块,然后发送终端分块(表示分块结束的零长度分块)

在另一个方向,HTTP/1.1到HTTP/2,当代理接收到分块内容时,它可以简单地放弃
Transfer Encoding:chunked
头,从接收到的分块中生成一个数据帧,然后发送该帧。 最终,它将接收终端块(表示块结束的零长度块),并将其转换为长度为零的数据帧,并设置流结束标志

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


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

我发现有人也会问这个问题: