首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Node.JS (未知内容长度、分组传输编码)服务HTTP/1.0响应

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

Stack Overflow用户
提问于 2012-07-21 05:13:13
回答 3查看 6.2K关注 0票数 14

问题

我正在通过Node.JS服务一个长度未知的资源。因此,不能设置Content-Length头。对于HTTP1.1,这种性质的资源需要使用块编码。Node.JS知道这一点,并使用分块传输编码来发送数据,所有这些数据都是单独发送的,其标题如下:

代码语言:javascript
复制
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Connection: close
...

这一切都很好,对行为良好的客户也有好处。然而,我有一些行为不太好的客户端(即Android2.2和更早版本),我必须支持这些客户端。这些客户端不支持块传输编码。

修复尝试#1

我最初的想法是将编码设置为none,如下所示:

代码语言:javascript
复制
response.writeHead(200, {'Transfer-Encoding': 'none'});

这将禁用Node.js的自动分组编码,并保持与大多数客户端的兼容性。然而,现在我破坏了Android 2.3+客户端,因为当他们看到这样一个虚假的传输编码头时,他们只是咳嗽和窒息。

修正第二次尝试(在那里我需要帮助)

当我使用HTTP/1.0发出请求时,服务器正确地返回响应,而不需要分组编码:

代码语言:javascript
复制
HTTP/1.1 200 OK
Connection: close
...

这解决了我的问题,并允许我为所有麻烦的客户端服务流。我不需要为Transfer-Encoding发送虚假的标题,我仍然不需要指定内容的长度。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-28 02:20:17

强迫非块状反应,是正确的方法

有一种支持的方法可以关闭块编码:您只需使用Transfer-Encoding删除Request.removeHeader(姓名)头:

代码语言:javascript
复制
response.removeHeader('transfer-encoding');

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

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

票数 2
EN

Stack Overflow用户

发布于 2012-07-21 06:13:37

就我的目的而言,我找到了一种简单的方法,可以使用响应对象的一个无文档属性来禁用块的强制使用:

代码语言:javascript
复制
response.useChunkedEncodingByDefault = false;

就这么简单。当然,依赖此属性可用于未来版本的Node.js并不是最好的。也许有更好的解决办法,但这对我来说是可行的。

票数 8
EN

Stack Overflow用户

发布于 2021-01-26 09:37:52

Transfer-Encoding: identity也应该能工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11589671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档