Неправильный заголовок Проверка при использовании zlib в node.js
Я пытаюсь отправить простой HTTP-запрос POST, получить тело ответа. Следующим является мой код. Я получаю
Ошибка: неправильная проверка заголовка
внутри метода "zlib.gunzip". Я новичок в node.js, и я ценю любую помощь.
;
fireRequest: function() {
var rBody = '';
var resBody = '';
var contentLength;
var options = {
'encoding' : 'utf-8'
};
rBody = fSystem.readFileSync('resources/im.json', options);
console.log('Loaded data from im.json ' + rBody);
contentLength = Buffer.byteLength(rBody, 'utf-8');
console.log('Byte length of the request body ' + contentLength);
var httpOptions = {
hostname : 'abc.com',
path : '/path',
method : 'POST',
headers : {
'Authorization' : 'Basic VHJhZasfasNWEWFScsdfsNCdXllcjE6dHJhZGVjYXJk',
'Content-Type' : 'application/json; charset=UTF=8',
// 'Accept' : '*/*',
'Accept-Encoding' : 'gzip,deflate,sdch',
'Content-Length' : contentLength
}
};
var postRequest = http.request(httpOptions, function(response) {
var chunks = '';
console.log('Response received');
console.log('STATUS: ' + response.statusCode);
console.log('HEADERS: ' + JSON.stringify(response.headers));
// response.setEncoding('utf8');
response.setEncoding(null);
response.on('data', function(res) {
chunks += res;
});
response.on('end', function() {
var encoding = response.headers['content-encoding'];
if (encoding == 'gzip') {
zlib.gunzip(chunks, function(err, decoded) {
if (err)
throw err;
console.log('Decoded data: ' + decoded);
});
}
});
});
postRequest.on('error', function(e) {
console.log('Error occured' + e);
});
postRequest.write(rBody);
postRequest.end();
}
Ответы
Ответ 1
response.on('data', ...)
может принимать Buffer
, а не просто строки. При конкатенации вы неверно конвертируете в строку, а затем не можете использовать gunzip. У вас есть 2 варианта:
1) Соберите все буферы в массиве, а в событии end
объедините их с помощью Buffer.concat()
. Затем вызовите gunzip на результат.
2) Используйте .pipe()
и передайте ответ на объект gunzip, передавая его вывод в поток файлов или строку/буфер, если вы хотите получить результат в памяти.
Оба варианта (1) и (2) обсуждаются здесь: http://nickfishman.com/post/49533681471/nodejs-http-requests-with-gzip-deflate-compression