背景
https通信でちょっとしたテスト先にgoogle.co.jpを指定して
応答を受けると
content-type : text/html; charset=Shift_JIS
と、古いブラウザを考慮してかシフトJISで返される。
node.jsはUTF-8だと日本語の文字列もあまり気にすることなく
扱えるが、SJISだと話は別。変換ライブラリを使えば、この辺り
面倒見てもらえそうではあるが、とりあえず、素のSJISのまま
HTTPレスポンスを受けてそのままファイルに保存するには
どうするんだっけ?という復習やらリハビリw。
Content-lengthに頼らないBufferの扱い
Content-lengthが返ってくれば、これを元にBufferを長さ分確保して、
オフセット指定で、詰め込んでいけるが、そうでない場合、
Buffer.concatを使うとBufferに追加する処理ができる。
node.jsでsjisで受けたレスポンスをそのままファイルにする
var fs = require('fs');
var https = require('https');
options = {
host: 'www.google.co.jp',
port: 443,
path: '/',
};
https.get(options, function(res) {
console.log('HEADERS: ' + JSON.stringify(res.headers));
// HTTPヘッダを見てのとおり、sjisなので、utf8指定しても無駄
//res.setEncoding('utf8');
// content-lengthがなくても大丈夫
var content = new Buffer([]);
res.on('data', function(chunk) {
content = Buffer.concat([content, chunk]);
});
res.on('end', function() {
// エンコードは黙ってるとutf8にされるので、nullを明示的に指定する。
fs.writeFileSync("dump_sjis.txt", content, {
encoding: null
});
})
});