问题
我正在通过Node.JS提供一个长度未知的资源。由于这个原因,无法设置Content-Length
头信息。在HTTP 1.1中,此类资源需要使用分块编码(chunked encoding)传输。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模式提供服务?
curl -H "TE: chunked;q=1.0" -k --compressed http://nginx/
可以(对我们来说)部分地重现该问题,但无论如何。我们的NGINX版本较旧,更新它似乎可以解决我们的问题。 - Jamund FergusonVary: Transfer-Encoding, Accept
?(对于不可缓存的资源并不重要。)我建议您发布一个新问题,并发送给我一个链接。 - Brad