当前位置 : 主页 > 网页制作 > Nodejs >

Node.js HTTP请求:如何检测响应体编码?

来源:互联网 收集:自由互联 发布时间:2021-06-16
我正在使用https.request()使用以下熟悉的模式发出HTTPS请求: var request = https.request(options, function (response) { var chunks = []; response.on('data', function (chunk) { chunks.push(chunk); }); response.on('end', func
我正在使用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响应(其标题,状态和正文)将通过另一个协议作为JSON发送.

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

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

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

您是否可以通过检查缓冲区的 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,它是非常小的.

网友评论