gpt4 book ai didi

Node.js HTTP 请求 : How to detect response body encoding?

转载 作者:搜寻专家 更新时间:2023-10-31 23:24:59 26 4
gpt4 key购买 nike

我正在使用 https.request() 使用以下熟悉的模式发出 HTTPS 请求:

var request = https.request(options, function (response) {
var chunks = [];
response.on('data', function (chunk) {
chunks.push(chunk);
});

response.on('end', function () {
var buffer = Buffer.concat(chunks);
...
});
});
...
request.end();
...

一旦我有了完成的响应 Buffer,就需要将它打包成一个 JSON 对象。这样做的原因是因为我正在创建一种隧道,HTTP 响应(其 header 、状态和正文)将通过另一种协议(protocol)作为 JSON 发送。

为了支持文本和二进制响应,目前对我有用的是将 Buffer 编码为 Base64(使用 buffer.toString('base64')) 并在另一端使用 new Buffer(theJsonObject.body, 'base64') 取消编码。虽然这可行,但如果已知 HTTP 请求响应是二进制类型(例如图像),我可以有选择地仅执行 Base64 编码,效率会更高。否则,在上面显示的 https.request() 回调中,我可以简单地执行 chunk.toString() 并将 JSON 对象中的响应主体作为 UTF-8 传送字符串类型。我的 JSON 对象可能包含一个附加属性,向隧道的另一端指示“正文”是 UTF-8 字符串(例如 .htm、.css 等)还是 Base64 编码(例如图像) .

我能做的是尝试在响应 content-type header 中使用 MIME 类型来确定响应是否将是二进制的。我可能会维护一个我知道可以安全地假设为 UTF-8 的类型的“白名单”(例如“text/html”等)。所有其他(包括例如“image/png”)都将采用 Base64 编码。

谁能提出更好的解决方案?

最佳答案

能否使用file-type 包通过检查magic number 来检测文件类型?缓冲区的?

安装

npm install --save file-type

用法

var fileType = require('file-type');
var safeTypes = ['image/gif'];
var request = https.request(options, function (response) {
var chunks = [];
response.on('data', function (chunk) {
chunks.push(chunk);
});

response.on('end', function () {
var buffer = Buffer.concat(chunks);
var file = fileType(buffer) );
console.log( file );
//=> { ext: 'gif', mime: 'image/gif' }

// mime isn't safe
if ( safeTypes.indexOf(file.mime) == '-1' ) {
// do your Base64 thing
}
});
});
...
request.end();
...

如果您想免费使用代码包,请查看 package source on Github ,它非常小。

关于Node.js HTTP 请求 : How to detect response body encoding?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28718887/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com