logo  

跟我一起读RFC

跟我一起读RFC
作者: 陈安廉

摘要:软件开发进阶系列


3.6.1 块传输编码(Chunked Transfer Coding)


2020-12-02 13:35:30

块编码(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)。