Transfer-Encoding: chunked 应该如何呈现?
当浏览器处理使用分块编码传输的数据时,浏览器应该只显示原始数据,而不包括用于编码数据的块大小和换行符,对吧?
用这段代码作为例子:
https://gist.github.com/josiahcarlson/3250376
我的浏览器(Chrome和Firefox)显示了
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
你在头部信息里指定内容的编码方式了吗?
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
就可以了。
1
HTTP 1.0的客户端不需要解码分块数据。Python的BaseHTTPServer类默认使用的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