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

0 投票
3 回答
2682 浏览
提问于 2025-04-17 14:56

当浏览器处理使用分块编码传输的数据时,浏览器应该只显示原始数据,而不包括用于编码数据的块大小和换行符,对吧?

用这段代码作为例子:

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

撰写回答