14

问题

我正在通过 Node.JS 提供长度未知的资源。因此,Content-Length无法设置标题。对于 HTTP 1.1,要求对这种性质的资源使用分块编码。Node.JS 知道这一点,并自行使用分块传输编码发送我的数据,并带有以下标头:

HTTP/1.1 200 OK
Transfer-Encoding: chunked
Connection: close
...

对于表现良好的客户来说,这一切都很好。 但是,我必须支持一些表现不佳的客户端(即 Android 2.2 和更早版本)。 这些客户端不正确支持分块传输编码。

修复尝试 #1

我最初的想法是将编码设置为none

response.writeHead(200, {'Transfer-Encoding': 'none'});

这会禁用 Node.JS 的自动分块编码并保持与大多数客户端的兼容性。但是,现在我已经破坏了 Android 2.3+ 客户端,因为当他们看到这样一个虚假的传输编码标头时,他们只会咳嗽和窒息。

修复尝试 #2(我需要帮助的地方)

当我使用 发出请求时HTTP/1.0,服务器会正​​确返回没有分块编码的响应:

HTTP/1.1 200 OK
Connection: close
...

这解决了我的问题,并允许我为所有麻烦的客户提供服务。我不必为 发送虚假标头Transfer-Encoding,也不必指定内容的长度。

如何强制 Node.JS 的 HTTP 服务器始终以 HTTP/1.0 模式提供服务?

4

3 回答 3

8

出于我的目的,我找到了一种简单的方法来禁用强制使用分块,使用响应对象的未记录属性:

response.useChunkedEncodingByDefault = false;

就是这么简单。当然,依靠此属性可用于 Node.js 的未来版本并不是最好的。也许有更好的解决方案,但这对我现在有用。

于 2012-07-21T06:13:37.467 回答
2

强制非分块响应,正确的方式

有一种关闭分块编码的受支持方式:您只需Transfer-Encoding使用request.removeHeader(name)删除标头:

response.removeHeader('transfer-encoding');

无论如何,Node.js 都会尊重。甚至还有一个测试可以防止有人意外改变这种行为,所以我认为它使用起来非常安全。

所以你可以坚持尝试#1,但按照上面的描述做。

于 2017-09-28T02:20:17.060 回答
0

Transfer-Encoding: identity也应该工作。

于 2021-01-26T09:37:52.847 回答