服务HTTP / 1.0的回答与Node.js的(未知内容长度,块传输编码)(Serving HTT

2019-06-26 10:43发布

问题

我通过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以上版本的客户,因为他们只是咳嗽,窒息,当他们看到这样一个虚假的传输编码头。

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

当我就与请求HTTP/1.0 ,服务器正常返回而不分块编码的响应:

HTTP/1.1 200 OK
Connection: close
...

这解决了我的问题,让我来服务于所有我的麻烦的客户的工作流。 我没有发送伪造的标头Transfer-Encoding ,并且我还没有指定的内容有多长。

我怎么能强迫的node.js的HTTP服务器始终服务于HTTP / 1.0模式?

Answer 1:

强制无分块的反应,以正确的方式

有关闭分块编码的支持方式:您只需删除Transfer-Encoding使用头request.removeHeader(名称) :

response.removeHeader('transfer-encoding');

Node.js的将不管什么尊重。 甚至还有一个测试 ,以防止有人意外地改变这种行为,所以我认为这是相当安全的使用。

所以,你可以坚持的尝试#1,做起来如上所述。



Answer 2:

对于我而言,我发现了一个简单的方法来禁用的分块强制使用,使用响应对象的无证特性:

response.useChunkedEncodingByDefault = false;

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



文章来源: Serving HTTP/1.0 responses with Node.JS (unknown content length, chunked transfer encoding)