当前位置: 首页 > 面试题库 >

http.request中的nodeJS最大标头大小

林曦之
2023-03-14
问题内容

使用nodeJS v0.10.28,http请求中的标头内容的大小/长度是否受到限制?

让我解释:

我需要使用第三方供应商提供的休息服务。返回给我的数据在请求的标头中,主体通常为空(120个左右字符)。标头中的数据量从几个字符到几个100kb不等。

var https = require('https');

var httpHeaders = {
    Authorization: 'Basic ' + new Buffer(user + ':' + psw).toString('base64'),
    accept: '*/*',
    'Content-Type': 'text/plain; charset=utf-8'
};
var options = {
    host: "www.website.com",
    port: 8080,            
    path: "/" ,   
    method: 'GET',
    headers: httpHeaders,
    rejectUnauthorized: false,
    requestCert: true,
    agent: false
};

https.request(options, function(res) {
    res.setEncoding('utf8');
    if (res.statusCode == 200) {
        var json = res.headers["someHeaderInfo"];
        callback(null,{ "result" : JSON.parse(json) });
    } else {
        callback({ "error" : res.statusCode  });                            
    }
}).on('data', function (chunk) {
    console.log('BODY: ' + chunk);
}).on('error', function(e, res) {
    console.log("  Got error: " + e.message);
    callback({ "error" : e.message });
}).end();

上面的代码对于较小的标头工作正常,但在on(’error’上失败,在较大的标头上显示“ Parse Error”消息。

删除on error子句将引发以下异常:

Error: Parse Error
    at CleartextStream.socketOnData (http.js:1583:20)
    at CleartextStream.read [as _read] (tls.js:511:12)
    at CleartextStream.Readable.read (_stream_readable.js:320:10)
    at EncryptedStream.write [as _write] (tls.js:366:25)
    at doWrite (_stream_writable.js:226:10)
    at writeOrBuffer (_stream_writable.js:216:5)
    at EncryptedStream.Writable.write (_stream_writable.js:183:11)
    at write (_stream_readable.js:582:24)
    at flow (_stream_readable.js:591:7)
    at Socket.pipeOnReadable (_stream_readable.js:623:5)

标头大小有限制,我可以更改吗?我有什么解决方案?

谢谢


问题答案:

Node使用的HTTP协议解析器似乎是经过硬编码的,最大标头大小为8KB。相关常数。由于这是一个编译时常量,因此必须使用Node的自定义编译版本来将该常量设置得更大。

听起来确实像您正在使用的服务通过将大量数据放在标头中而犯了一个错误。标头用于有关请求正文的元数据。如果要返回的数据量很大,则可能应将其包含在请求正文中。

您可以使用替代HTTP解析器(例如http-parser-js)进行探索,因为它似乎没有限制。



 类似资料:
  • 有什么方法可以配置响应的最大标头大小吗? 我从netty框架中得到以下错误: 显然reactor为此添加了一个API,但我不知道在SpringWebFlux的WebClient中这是如何控制的。我正在使用以下版本 有什么想法吗?

  • 问题内容: 所以基本上我正在生成随机的10000个IP地址,我想存储在HashSet中找到的所有那些IP地址,但是根据我的计算,发现了大约6000个IP地址,但是在HashSet中仅存储了700个IP地址?HashSet在存储String方面是否有任何限制。任何建议将不胜感激。 问题答案: 就您而言,没有限制(限制是数组的最大大小,即2 ** 31)。 但是,仅存储 唯一 值,因此我的猜测是您仅生

  • 问题内容: 为什么会限制其大小? 我浏览了一些链接:http : //www.coderanch.com/t/540346/java/java/maximum-size-hold- String-buffer 。 是因为count成员变量是int吗? 假设我们有2 ^ 31-1个字符,并在其中追加了一些字符。Count成员变量将增加附加的字符数,如果Count变量已经达到最大值(2 ^ 31-1)

  • 问题内容: 我知道Java中一个方法的最大大小为64k。如果超过该限制,我们将收到一个编译器警告,例如“代码太大而无法编译”。所以我们可以称这为Java的缺点吗? 我们可以增加这个大小限制,还是真的有可能增加? 关于此方法大小还有其他想法吗? 问题答案: 以我的经验,64KB的限制只是生成代码的问题。尤其是 初始化大型数组时(通过代码完成) 在结构良好的代码中,每种方法的长度都是可管理的,并且比此

  • 问题内容: 上下文:我正在构建一个读取rss feed并在后台更新/检查feed的小站点。我有一个数组来存储要显示的数据,另一个数组来存储已显示的记录的ID。 问题:在事情变慢或变慢之前,数组可以在Javascript中容纳多少个项目。我没有对数组进行排序,但是正在使用jQuery的inArray函数进行比较。 该网站将保持运行状态,并进行更新,并且不太可能经常重启/刷新浏览器。 如果我想从数组中

  • 问题内容: 我正在使用一个简单的Web实用程序,该实用程序使用HTML5的IndexedDB(类似于键值数据库)功能。 我一直在寻找,但我不知道:一件物品可以存储的最大尺寸是多少? 问题答案: 我认为单个项目的大小没有具体限制,只有全局限制。 自最初编写此答案以来,有关全局限制的规则已更改。所述向上的最新文档是关于MDN-取决于可用的磁盘空间,“基团”极限(对于给定的结构域,包括其所有的子域) 的