我通过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及更早版本)。这些客户端不支持正确的分块传输编码。
我最初的想法是将编码设置为none
,如下所示:
response.writeHead(200, {'Transfer-Encoding': 'none'});
这会禁用Node.JS的自动分块编码,并保持与大多数客户端的兼容性。但是,现在我已经破坏了Android 2.3+客户端,因为当他们看到这样一个伪造的传输编码头时,他们只是咳嗽和窒息。
当我使用HTTP/1.0
发出请求时,服务器正确地返回没有分块编码的响应:
HTTP/1.1 200 OK
Connection: close
...
这解决了我的问题,并允许我提供适用于我所有麻烦客户的流。我不必为Transfer-Encoding
发送虚假标题,我仍然不必指定内容的长度。
如何强制Node.JS的HTTP服务器始终以HTTP / 1.0模式运行?
答案 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
也应该有效。