我正在使用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')
),并在另一端使用new Buffer(theJsonObject.body, 'base64')
解码它。虽然这可以工作,但如果我只在已知HTTP请求响应是二进制类型(例如图像)时选择性地执行Base64编码,那么效率会更高。否则,在上面显示的https.request()
回调中,我可以简单地使用chunk.toString()
,并将响应主体以UTF-8字符串类型传递到JSON对象中。我的JSON对象可能包含一个额外的属性,指示隧道的另一端“body”是UTF-8字符串(例如.htm、.css等)还是Base64编码(例如图像)。我可以尝试使用响应
content-type
标头中的MIME类型来确定响应是否为二进制。我可能会维护一个白名单,其中包括我知道可以安全地假设为UTF-8的类型(如"text/html"等)。所有其他类型(包括例如'image/png')都将被Base64编码。有人能提出更好的解决方案吗?
Content-Type
可能真的是唯一的方法。想想看,如果我可以安全地检测到该标头值中出现了 "text",那么我是否可以假定它是文本数据呢?如果我没有在值中看到 "text",那么只需进行 Base64 编码即可?也许这将是一个安全的策略?(我还应该提到,我完全控制所访问的端点服务器。因此,我可以保证 MIME 类型是正确的。) - Trevor