web-dev-qa-db-fra.com

Vérification d'en-tête incorrecte lors de l'utilisation de zlib dans node.js

J'essaie d'envoyer une simple requête HTTP POST, récupérez le corps de la réponse. Voici mon code. Je reçois

Erreur: vérification d'en-tête incorrecte

à l'intérieur de la méthode "zlib.gunzip". Je suis nouveau sur node.js et j'apprécie toute aide.

;

    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();

}
31
Thusitha Nuwan

response.on('data', ...) peut accepter un Buffer, pas seulement des chaînes simples. Lors de la concaténation, vous vous convertissez en chaîne de façon incorrecte, puis vous ne pouvez plus utiliser gunzip. Vous avez 2 options:

1) Collectez tous les tampons d'un tableau et, dans l'événement end, concaténez-les à l'aide de Buffer.concat(). Appelez ensuite gunzip sur le résultat.

2) Utilisez .pipe() et dirigez la réponse vers un objet gunzip, en redirigeant la sortie vers un flux de fichiers ou une chaîne/chaîne tampon si vous voulez que le résultat soit en mémoire.

Les deux options (1) et (2) sont discutées ici: http://nickfishman.com/post/49533681471/nodejs-http-requests-with-gzip-deflate-compression

18
Nitzan Shaked