提问者:小点点

应该如何呈现传输编码:分块?


当浏览器呈现使用分块编码转换的数据时,浏览器应该呈现原始数据,而不添加块大小和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个答案

匿名用户

HTTP1.0客户端不需要解码分块数据。python的BaseHTTPServer类发送的默认超文本传输协议版本是HTTP1.0。如果您发送1.1版本,浏览器将按照您的预期呈现数据。我想curl只是想通过做正确的事情来变得聪明,即使服务器发送了错误的协议版本。

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

自我protocol_version='HTTP/1.1'

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

匿名用户

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

匿名用户

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

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\n this is chunk:0\r\n\r\n"

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