我正在通过Node. JS提供未知长度的资源。因此,无法设置Content-Llong
标头。对于HTTP1.1,要求对这种性质的资源使用分块编码。Node.JS知道这一点,并自行使用分块传输编码发送我的数据,标头如下:
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Connection: close
...
对于表现良好的客户端来说,这一切都很好。但是,我有一些表现不佳的客户端(即Android 2.2及更早版本),我必须支持。这些客户端不正确地支持分块传输编码。
我最初的想法是将编码设置为no
,如下所示:
response.writeHead(200, {'Transfer-Encoding': 'none'});
这禁用了Node. JS的自动分块编码并保持与大多数客户端的兼容性。然而,现在我已经破坏了Android 2.3客户端,因为当他们看到这样一个虚假的传输编码标头时,他们只会咳嗽和窒息。
当我使用HTTP/1.0
发出请求时,服务器会正确返回响应,而不会进行分块编码:
HTTP/1.1 200 OK
Connection: close
...
这解决了我的问题,并允许我为所有麻烦的客户提供一个流。我不必为Transtrans-Encode
发送虚假的标头,也不必指定内容的长度。
如何强制Node. JS的HTTP服务器始终以HTTP/1.0模式运行?
出于我的目的,我找到了一种简单的方法来禁用强制使用chunked,使用响应对象的未记录属性:
response.useChunkedEncodingByDefault = false;
就这么简单。当然,依赖这个属性在Node. js的未来版本中可用并不是最好的。也许有更好的解决方案,但这对我现在有效。
有一种支持的关闭分块编码的方法:您只需使用request. RemoveHeader(name)删除Transtrans-Encode
标头:
response.removeHeader('transfer-encoding');
Node. js无论如何都会尊重。甚至还有一个测试来防止某人意外改变这种行为,所以我认为它使用起来非常安全。
所以你可以坚持尝试#1,但要像上面描述的那样去做。
转移编码:身份
也应该起作用。