当浏览器呈现使用分块编码传输的数据时,浏览器应该在没有块大小的情况下呈现原始数据并添加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
我没想到会看到块大小。
我们是否应该使用浏览器中没有结束信息的数据来呈现数据?
答案 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)
您是否在标题中指定了内容编码?