nodejs node example http node.js https gzip deflate

example - node.js-solicitudes HTTP fáciles con compresión gzip/deflate



request nodejs (6)

Al mirar dentro del código fuente , debe configurar el parámetro gzip en la lib solicitud para que gzip funcione. No estoy seguro de si esto fue intencional o no, pero esta es la implementación actual. No se necesitan encabezados adicionales.

var request = require(''request''); request.gzip = true; request({url: ''https://...''}, // use encoding:null for buffer instead of UTF8 function(error, response, body) { ... } );

Estoy tratando de descubrir cómo la mejor manera de enviar fácilmente solicitudes HTTP / HTTPS y manejar gzip / deflate las respuestas comprimidas junto con las cookies.

Lo mejor que encontré fue https://github.com/mikeal/request que maneja todo excepto la compresión. ¿Hay algún módulo o método que haga todo lo que le pido?

Si no, ¿puedo combinar request y zlib de alguna manera? Traté de combinar zlib y http.ServerRequest, y falló miserablemente.

¡Gracias!


Aquí hay un ejemplo de trabajo que dispara la respuesta

function gunzipJSON(response){ var gunzip = zlib.createGunzip(); var json = ""; gunzip.on(''data'', function(data){ json += data.toString(); }); gunzip.on(''end'', function(){ parseJSON(json); }); response.pipe(gunzip); }

Código completo: https://gist.github.com/0xPr0xy/5002984



Para cualquier persona que se encuentre con esto en los últimos tiempos, la biblioteca de solicitudes admite la descompresión de gzip de forma inmediata. Use de la siguiente manera:

request( { method: ''GET'' , uri: ''http://www.google.com'' , gzip: true } , function (error, response, body) { // body is the decompressed response body console.log(''server encoded the data as: '' + (response.headers[''content-encoding''] || ''identity'')) console.log(''the decoded data is: '' + body) } )

Del readme de github https://github.com/request/request

gzip: si es verdadero, agregue un encabezado Accept-Encoding para solicitar codificaciones de contenido comprimido del servidor (si no están ya presentes) y decodifique las codificaciones de contenido admitidas en la respuesta. Nota: La decodificación automática del contenido de respuesta se realiza en los datos corporales devueltos por solicitud (tanto a través de la secuencia de solicitud como pasados ​​a la función de devolución de llamada) pero no se realiza en la secuencia de respuesta (disponible desde el evento de respuesta) que es el http no modificado Objeto IncomingMessage que puede contener datos comprimidos. Vea el ejemplo a continuación.


Simplemente puede combinar request y zlib con streams.

Aquí hay un ejemplo, suponiendo que tiene un servidor escuchando en el puerto 8000:

var request = require(''request''), zlib = require(''zlib''); var headers = { ''Accept-Encoding'': ''gzip'' }; request({url:''http://localhost:8000/'', ''headers'': headers}) .pipe(zlib.createGunzip()) // unzip .pipe(process.stdout); // do whatever you want with the stream


//functions.js: var ce=require(''cloneextend''); //console.log({aa:''bb'',dd:new Date(''10/10/2011'')}); //console.log(ce.clone({aa:''bb'',dd:new Date(''10/10/2011'')})); exports.cloneextend=ce; exports.clone=ce.clone; exports.extend=ce.extend; ////////////request var request1=require(''request''); var Iconv=require(''iconv'').Iconv; var iconv_utf8_to_latin = new Iconv(''utf-8'',''iso-8859-1''); var iconv_iso8859_8i_to_utf8 = new Iconv(''iso-8859-8'',''utf-8''); var iconv_utf8_to_iso8859_8i = new Iconv(''utf-8'',''iso-8859-8''); exports.iconv_iso8859_8i_to_utf8=iconv_iso8859_8i_to_utf8; exports.iconv_utf8_to_iso8859_8i=iconv_utf8_to_iso8859_8i; var zlib=require(''zlib''); function request_unzip(options,cb) { var enc=options.encoding; options.encoding=null; var r=request1(options) .on(''response'',function(response) { var bufarr=[]; var errored=false; switch (response.headers[''content-encoding'']) { // or, just use zlib.createUnzip() to handle both cases case ''gzip'': case ''deflate'': if(response.headers[''content-encoding'']==''gzip'') var zpipe=zlib.createGunzip(); else var zpipe=zlib.createInflate(); zpipe .on(''data'', function(d){bufarr.push(d);}) .on(''end'', function(){ if(errored) return;errored=true; cb(null,response, enc?Buffer.concat(bufarr).toString(enc):Buffer.concat(bufarr) ); }) .on(''error'', function(err){ if(errored) return;errored=true; cb(err,response,null);}); response.pipe(zpipe); response .on(''error'', function(err){ if(errored) return;errored=true; cb(err,response,null);}); break; default: response .on(''data'', function(d){bufarr.push(d);}) .on(''end'', function(){ if(errored) return;errored=true; cb(null,response, enc?Buffer.concat(bufarr).toString(enc):Buffer.concat(bufarr) ); }) .on(''error'', function(err){ if(errored) return;errored=true; cb(err,response,null);}); break; } }); return r; } function request(options,cb)// a request that fixes encoding { if(options.encoding==''iso-8859-8'') { options.encoding=''binary''; return request_unzip(options, function(error,request,data){ if(data===undefined||data===null) { data2=null; cb(error,request,data2); } else { try{ cb(error,request, iconv_iso8859_8i_to_utf8.convert(iconv_utf8_to_latin.convert(data)).toString(''utf8'') //conver buffer to string ); } catch(e) { data2=null; error=e; cb(error,request,data2); } } }); } else return request_unzip(options,cb); } request.__proto__=request1; exports.request=request; ie9headers= // no var goes to global { followAllRedirects:true, headers: { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "he-IL,he;q=0.8,en-US;q=0.6,en;q=0.4", "User-Agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22",//"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0)", "Accept-Charset": "windows-1255,utf-8;q=0.7,*;q=0.3", "Accept-Encoding": "gzip,deflate,sdch" } } /// example: f=require(''./function.js''); //goes global function getsomething(cb){ function getit(){ f.request(f.extend({jar:j,url:myurl, headers:{Referer:url}, encoding:''UTF-8'' },ie9headers),function(error,request,data) { if(error) setTimeout(getit,1000); //console.log("data",data); var parsed=myparse(data); cb(parsed); });} getit(); }