我正在使用https.request()使用以下熟悉的模式发出HTTPS请求: var request = https.request(options, function (response) { var chunks = []; response.on('data', function (chunk) { chunks.push(chunk); }); response.on('end', func
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,它是非常小的.