http2/http1.1 代理如何处理 Transfer-Encoding?
How http2/http1.1 proxy handle the Transfer-Encoding?
HTTP/2 禁止 connection-specific header 字段。以下 header 字段不得出现:"Connection"、"Keep-Alive"、"Proxy-Connection"、"Transfer-Encoding" 和 "Upgrade"。此外,"TE" header 字段不得包含除 "trailers".
以外的任何值
我想问的是,既然HTTP/2禁止Transfer-Encodingheader,那么HTTP/2代理如何处理header[=32] =]:分块?
代理是否应该始终将整个分块请求缓存在内存中并添加 Content-Length header,发送到 HTTP/2 server/client?
在 HTTP/2 中,内容始终是 "chunked",因为它是在数据帧中发送的,即携带块长度的字节块以及 end-of-stream 标志,如果frame是最后一帧。
在HTTP/2到HTTP/1.1代理中,代理有多种选择。
一个非常简单的案例是重新映射每个 HTTP/2 收到的数据帧并将其作为 HTTP/1.1 块发送出去。
因此,代理必须将 Transfer-Encoding: chunked
header 添加到通信的 HTTP/1.1 端。
同样,它可以将每个内容 read 重新映射到一个数据帧中(而不是 wait/buffer 用于整个块,如果它很大的话)。
另一种情况是缓冲一些接收到的DATA帧,希望其中一个设置了end-of-stream标志。
如果发生这种情况,则整个内容长度是已知的,代理可以添加 Content-Length
header 并立即发送整个内容。
同样在前一种情况下,当缓冲区溢出时,代理可以添加 Transfer-Encoding: chunked
header 并发送一个缓冲区大小的块(而不是数据帧的大小就像第一种情况一样)。
当代理收到最后一个数据帧时,它会将剩余的字节分块,然后发送终端块(zero-length 块,表示块结束)。
在另一个方向,HTTP/1.1到HTTP/2,当代理接收到分块内容时,它可以简单地丢弃Transfer-Encoding: chunked
header,做一个DATA从接收到的块中取出帧,并发送该帧。
最终它将接收到终端块(zero-length 块,表示块结束),并将其转换为长度为零的数据帧,并设置了 end-of-stream 标志。
当然,如果代理执行了一些缓冲或其他优化,DATA 帧大小可能不完全等于块大小。
由于 HTTP/2 receives/sends 包含 end-of-stream 标志的数据帧,代理可以轻松翻译 to/from HTTP/1.1,将 end-of-stream 数据帧映射到终端块,并将终端块映射到 end-of-stream 数据帧。
HTTP/2 禁止 connection-specific header 字段。以下 header 字段不得出现:"Connection"、"Keep-Alive"、"Proxy-Connection"、"Transfer-Encoding" 和 "Upgrade"。此外,"TE" header 字段不得包含除 "trailers".
以外的任何值我想问的是,既然HTTP/2禁止Transfer-Encodingheader,那么HTTP/2代理如何处理header[=32] =]:分块?
代理是否应该始终将整个分块请求缓存在内存中并添加 Content-Length header,发送到 HTTP/2 server/client?
在 HTTP/2 中,内容始终是 "chunked",因为它是在数据帧中发送的,即携带块长度的字节块以及 end-of-stream 标志,如果frame是最后一帧。
在HTTP/2到HTTP/1.1代理中,代理有多种选择。
一个非常简单的案例是重新映射每个 HTTP/2 收到的数据帧并将其作为 HTTP/1.1 块发送出去。
因此,代理必须将 Transfer-Encoding: chunked
header 添加到通信的 HTTP/1.1 端。
同样,它可以将每个内容 read 重新映射到一个数据帧中(而不是 wait/buffer 用于整个块,如果它很大的话)。
另一种情况是缓冲一些接收到的DATA帧,希望其中一个设置了end-of-stream标志。
如果发生这种情况,则整个内容长度是已知的,代理可以添加 Content-Length
header 并立即发送整个内容。
同样在前一种情况下,当缓冲区溢出时,代理可以添加 Transfer-Encoding: chunked
header 并发送一个缓冲区大小的块(而不是数据帧的大小就像第一种情况一样)。
当代理收到最后一个数据帧时,它会将剩余的字节分块,然后发送终端块(zero-length 块,表示块结束)。
在另一个方向,HTTP/1.1到HTTP/2,当代理接收到分块内容时,它可以简单地丢弃Transfer-Encoding: chunked
header,做一个DATA从接收到的块中取出帧,并发送该帧。
最终它将接收到终端块(zero-length 块,表示块结束),并将其转换为长度为零的数据帧,并设置了 end-of-stream 标志。
当然,如果代理执行了一些缓冲或其他优化,DATA 帧大小可能不完全等于块大小。
由于 HTTP/2 receives/sends 包含 end-of-stream 标志的数据帧,代理可以轻松翻译 to/from HTTP/1.1,将 end-of-stream 数据帧映射到终端块,并将终端块映射到 end-of-stream 数据帧。