分块传输编码 - 浏览器行为

时间:2012-11-26 02:31:37

标签: http google-chrome firefox browser

我正在尝试以分块模式发送数据。正确设置所有标头并相应地编码数据。浏览器将我的响应识别为一个分块,接受标题并开始接收数据。

我期待浏览器会在每个收到的块上更新页面,而是等待直到收到所有块然后全部显示它们。这是预期的行为吗?

我希望看到每个块在收到后立即显示。使用curl时,每个块在收到后立即显示。为什么GUI浏览器不会发生同样的情况?他们使用某种缓冲/缓存吗?

我将Cache-Control标头设置为no-cache,因此不确定它是否与缓存有关。

3 个答案:

答案 0 :(得分:15)

afaik浏览器需要一些有效负载才能在收到时启动渲染块 卷曲当然是个例外。

尝试在第一个块之前发送大约1KB的任意数据。

如果你正确地做了一切,浏览器应该在收到它们时渲染块。

答案 1 :(得分:0)

The browser can process and render the data as it comes in whether data is sent chunked or not. Whether a browser renders the response data is going to be a function of the data structure and what kind of buffering it employs. e.g. Before the browser can render an image, it needs to have the document (or enough of the document), the style sheet, etc.

Chunking is mostly useful when the length of a resource is unknown at the time the resource response is generated (a "Content-Length" can't be included in the response headers) and the server doesn't want to close the connection after the resource is transferred.

答案 2 :(得分:0)

1)截至2019年,如果您使用Content-type: text/html,则Chrome中不会出现缓冲。


2)如果您只想流文本,类似于text/plain,那么仅使用Content-type: text/event-stream也会禁用缓冲。


3)如果您使用Content-type: text/plain,则Chrome仍将缓冲1 KiB,除非您另外指定X-Content-Type-Options: nosniff

RFC 2045 specifies,如果未指定Content-Type,则应假设Content-type: text/plain; charset=us-ascii

  

5.2。内容类型默认值

     

采用不带MIME Con​​tent-Type标头的默认RFC 822消息     通过此协议可以是US-ASCII字符集中的纯文本,     可以明确指定为:

Content-type: text/plain; charset=us-ascii
     

如果未指定Content-Type头字段,则假定为默认值。     还建议在以下情况下采用此默认设置:     遇到语法无效的Content-Type标头字段。在     MIME版本标头字段的存在和任何     Content-Type标头字段,接收方用户代理也可以假设     普通的US-ASCII文本就是发送者的意图。普通US-ASCII     如果没有MIME版本或     存在语法无效的Content-Type标头字段,但     发件人的意图可能是相反的。

浏览器将开始对text/plain进行一定程度的缓冲,以检查他们是否可以检测发送的内容是真的纯文本还是某种媒体类型(例如图像),以防Content-Type是省略,则将等于text/plain内容类型。这称为MIME类型嗅探。

MIME类型嗅探is defined by Mozilla为:

  

在没有MIME类型的情况下,或者在某些情况下使用浏览器   认为它们不正确,浏览器可能会执行MIME嗅探-   通过查看的字节来猜测正确的MIME类型   资源。

     

每个浏览器以不同的方式执行MIME嗅探   情况。 (例如,Safari将在   如果发送的MIME类型不合适,则返回URL。)有安全性   担心,因为某些MIME类型表示可执行内容。服务器可以   通过发送X-Content-Type-Options标头来防止MIME嗅探。

根据Mozilla's documentation

  

X-Content-Type-Options响应HTTP标头是由   服务器以指示在   Content-Type标头不应更改,应遵循。这个   允许退出MIME类型嗅探,换句话说,这是一个   网站管理员知道他们在做什么的方式。

因此,添加X-Content-Type-Options: nosniff可以使其正常工作。