当前位置: 首页 > 知识库问答 >
问题:

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

楚弘益
2023-03-14

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

我希望浏览器会更新每个接收到的区块的页面,而不是等到所有区块都被接收,然后显示它们。这是预期的行为吗?

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

我将Cache-Control标头设置为no-ache,所以不确定它是关于缓存的。

共有3个答案

赫连晋
2023-03-14

无论数据是否分块发送,浏览器都可以处理和呈现数据。浏览器是否呈现响应数据将取决于数据结构以及它使用的缓冲类型。e、 g.在浏览器渲染图像之前,它需要有文档(或足够的文档)、样式表等。

当生成资源响应时资源的长度未知(响应头中不能包含“内容长度”)且服务器不想在资源传输后关闭连接时,分块最有用。

燕翼
2023-03-14

修正你的标题。

  1. 从2019年起,如果您使用内容类型:text/html,则Chrome中不会出现缓冲

RFC 2045规定,如果未指定内容类型内容类型:文本/普通;应假定字符集=us ascii

5.2. 内容类型默认值

此协议将不带MIME内容类型标头的默认RFC 822消息视为US-ASCII字符集中的纯文本,可明确指定为:

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

如果未指定内容类型标题字段,则假定此默认值。当遇到语法无效的内容类型头字段时,还建议假定此默认值。在存在MIME版本头字段且不存在任何内容类型头字段的情况下,接收用户代理还可以假定发送方的意图是纯US-ASCII文本。在没有MIME版本或存在语法无效的内容类型标题字段的情况下,仍然可以假定为纯US-ASCII文本,但发送方的意图可能不是这样。

浏览器将开始缓冲一定数量的文本/纯,以检查他们是否可以检测发送的内容是否真的是纯文本或某种媒体类型,如图像,以防Content-Type被省略然后将等于一个文本/普通内容类型。这被称为MIME类型嗅探。

MIME类型嗅探由Mozilla定义为:

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

每个浏览器在不同的环境下执行不同的MIME嗅探。(例如,如果发送的MIME类型不合适,Safari将查看URL中的文件扩展名。)由于某些MIME类型表示可执行内容,因此存在安全问题。服务器可以通过发送X-Content-Type-Options头来防止MIME嗅探。

根据Mozilla的文档:

X-Content-Type-Options响应HTTP头是服务器使用的一个标记,用于指示不应更改并遵循Content-Type头中公布的MIME类型。这允许选择退出MIME类型嗅探,或者换句话说,这是一种表示网站管理员知道他们在做什么的方式。

因此,添加X-Content-Type-Options:nosniff可以让它工作。

诸彬郁
2023-03-14

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

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

如果你做的一切都是正确的,浏览器应该呈现他们收到的块。

 类似资料:
  • 问题内容: 该代码是否有效的HTTP / 1.1? 我认为我在这里违反HTTP / 1.1?文本文件似乎确实可以正常工作,但这可能是偶然的。我的标题是“ 200 OK”还是需要为“ 100”?一个头足够吗? 问题答案: 如果要进行分块传输编码,则实际上需要设置该标头: 您可以从google返回的标头中看到该标头,该标头会对主页以及最可能的其他页面进行分块传输: 编辑 Yikes,读起来太复杂了:

  • 我们正在尝试让Flask web服务正常工作,但是流式帖子出现了一些问题,例如,当标题包含传输编码时:chunked。 似乎默认的flask不支持HTTP 1.1。这有什么办法吗? 我们正在运行此命令: 违反此代码: 以下是旋度输出: 这是Flask服务器的输出:

  • 我正在做一个测试,Firefox如何编码字符。 但事实让我困惑。 超文本标记语言代码: xxx是一些汉字。这些字符必须编码成%xx等格式才能通过HTTP传输。 首先,我用UTF-8编码源文件。使用firefox打开html文件。img标签将发送一个请求,“xxx”字符由UTF8编码。 (用UTF8编码HTML源文件,字符集=UTF8,浏览器用UTF编码URL) 我把meta改成了

  • 如能提供任何协助,将不胜感激。

  • 我使用SpringWebFlux反应式库创建了大量RESTAPIendpoint。我现在面临的问题是,SpringWebFlux返回的响应具有传输编码:分块HTTP头。因为哪个客户端应用程序使用像Axios这样的库(https://github.com/axios/axios)浏览器javascript中基于promise的HTTP客户端失败。如何关闭传输编码:分块? Spring webflux

  • 问题内容: 由于我在更常规的基础上使用WebSocket连接,因此我对事物的工作原理很感兴趣。因此,我花了一段时间研究无休止的规范文档,但到目前为止,我还没有真正找到有关 分块传输流本身的 任何信息。 WebSocket协议将其称为 数据帧 (描述了纯数据流,因此也称为 非控制帧 )。据我了解,规范没有定义最大长度,也没有定义MTU(最大传输单位)值,这反过来意味着单个WebSocket数据帧可以