Transfer-encoding:chunked应该如何呈现?

时间:2013-02-06 08:31:00

标签: python http transfer-encoding

当浏览器呈现使用分块编码传输的数据时,浏览器应该在没有块大小的情况下呈现原始数据并添加CRLF来编码数据,是否正确?

以此代码为例:

https://gist.github.com/josiahcarlson/3250376

我的浏览器(Chrome和FF)呈现

12
this is chunk: 0

12
this is chunk: 1

12
this is chunk: 2

12
this is chunk: 3

12
this is chunk: 4

12
this is chunk: 5

12
this is chunk: 6

12
this is chunk: 7

12
this is chunk: 8

12
this is chunk: 9

0

我没想到会看到块大小。

我们是否应该使用浏览器中没有结束信息的数据来呈现数据?

3 个答案:

答案 0 :(得分:1)

HTTP 1.0客户端不需要解码分块数据。 python< BaseHTTPServer类发送的默认http版本是HTTP 1.0。如果您发送1.1版本,浏览器将按照您的预期呈现数据。我想,即使服务器发送了错误的协议版本,curl也只是想做一件正确的事情。

在发送响应之前,修补代码以设置BaseHTTPServer实例的protocol_version属性。在示例的第73行添加此内容。

self.protocol_version =' HTTP / 1.1'

有关HTTP 1.0和HTTP 1.1之间差异的更多详细信息,可以参考此http://www8.org/w8-papers/5c-protocols/key/key.html

答案 1 :(得分:0)

代码显式发送该消息。生成器创建这些块:

yield "this is chunk: %s\r\n"%i

然后将它们写入套接字

def write_chunk():
    tosend = '%X\r\n%s\r\n'%(len(chunk), chunk)
    self.wfile.write(tosend)

如果你适应它,你可以发送你想要的任何东西。

因此,如果生成的块是"this is chunk: 0\r\n",则write_chunk方法实际发送"18\r\nthis is chunk: 0\r\n\r\n"

"\r\n"是转义序列,表示回车,换行符。或Windows版本的换行符。在Linux上,您可以使用\n

答案 2 :(得分:0)

您是否在标题中指定了内容编码?