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

我正在使用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 () {
        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,它是非常小的.

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...