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

问题

我正在通过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+客户端,因为他们只是看到这样一个伪造的传输编docker咳嗽和呛。

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

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

 HTTP/1.1 200 OK Connection: close ... 

这解决了我的问题,使我能够为我所有的麻烦客户服务。 我不必为Transfer-Encoding发送伪造标题,而且我也不必指定内容的长度。

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

强制不分块的回应,正确的方法

有一种closures分块编码的支持方式:你只需要使用request.removeHeader(name)去除Transfer-Encoding标题:

 response.removeHeader('transfer-encoding'); 

无论如何Node.js都会尊重。 甚至有一个testing,以防止意外改变这种行为的人,所以我认为这是非常安全的使用。

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

出于我的目的,我find了一个简单的方法来禁用强制使用chunked,使用响应对象的未logging的属性:

 response.useChunkedEncodingByDefault = false; 

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