使用Node.JS提供HTTP / 1.0响应(未知内容长度,分块传输编码)

时间:2012-07-21 05:13:14

标签: http node.js http-1.1 transfer-encoding http-1.0

问题

我通过Node.JS提供未知长度的资源。因此,无法设置Content-Length标头。对于HTTP 1.1,需要将chunked编码用于此类资源。 Node.JS知道这一点并使用chunked transfer encoding自己发送我的数据,并带有以下标题:

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模式运行?

3 个答案:

答案 0 :(得分:8)

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

response.useChunkedEncodingByDefault = false;

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

答案 1 :(得分:2)

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

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

response.removeHeader('transfer-encoding');

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

所以你可以坚持尝试#1,但是如上所述。

答案 2 :(得分:0)

Transfer-Encoding: identity 也应该有效。