3.6.1 块传输编码(Chunked Transfer Coding)
块编码(chunked encoding)改变消息主体使消息主体(message body)成块发送。每一个块有它自己的大小(size)指示器,在所有的块之后会紧接着一个可选的包含实体头域的尾部 (trailer)。这种编码允许发送端能动态生成内容,并能携带能让接收端判断消息是否接收完整的有用信息。
Chunked-Body = *chunk last-chunk trailer CRLF chunk = chunk-size [ chunk-extension ] CRLF chunk-data CRLF chunk-size = 1*HEX last-chunk = 1*("0") [ chunk-extension ] CRLF chunk-extension= *( ";" chunk-ext-name [ "=" chunk-ext-val ] ) chunk-ext-name = token chunk-ext-val = token | quoted-string chunk-data = chunk-size(OCTET) trailer = *(entity-header CRLF)
chunk-size 是用 16 进制数字字符串。块编码(chunked encoding)以大小为 0 的块结束,紧接着是尾部(trailer),尾部以一个空行终止。
尾部(trailer)允许发送端在消息的末尾包含额外的 HTTP 头域(header field)。Trailer 头域 (Trailer header field,在 14.40 节阐述)来指明哪些头域被包含在块传输编码的尾部 (trailer) (见 14.40 节)
如果服务器要使用块传输编码进行响应,除非以下至少一条为真时它才能包含尾部 (trailer):
a)如果此响应的对应请求包括一个 TE 头域,并且利用 “trailers”指明了块传输编码响应的尾 部是可以接受的(TE 头域在 14.39 节中描述;或者
b)如果是源服务器进行响应,响应里 trailer 字段里全部包含的是可选的元信息,并且接收端 接收此块传输编码响应时可能不会理会响应的尾部(以一种源服务器是可以接受的方式)。换 句话说,源服务器原意接受尾部(trailer)可能会在到达客户端时被丢弃的可能性。
当消息被一个 HTTP/1.1(或更高版本)的代理(proxy)接收并转发到一个 HTTP/1.0 接收端的时候,此要求防止了一种互操作性的失败。
在附录 19.4.6 节介绍了一个例子,这个例子介绍怎样对一个块主体(chunked-body)进行解码。
所有 HTTP/1.1 应用程序必须能接收和解码以块(chunked)传输编码进行编码的消息主体,并且必须能忽略它们不能理解的块扩展(chunk-extentsion)。