Pregunta

Actualmente estoy trabajando en un servidor proxy en el que en este caso hay que modificar los datos (mediante el uso de expresiones regulares) que nos empuje a través de él.

En la mayoría de los casos funciona bien, excepto para los sitios web que el uso gzip como la codificación de contenido (creo), me he encontrado con un módulo llamado compresa y trató de empujar los trozos que recibo a través de un flujo de descomprimir / gunzip pero no es realmente resultando como esperaba. (Ver más abajo para el código)

imaginé que había puesto algo de código para apoyar mi problema, este es el proxy que se carga con MVC (expreso):

module.exports = {
index: function(request, response){
    var iframe_url = "www.nu.nl"; // site with gzip encoding    

    var http = require('http');     
    var httpClient = http.createClient(80, iframe_url);
    var headers = request.headers;
    headers.host = iframe_url;

    var remoteRequest = httpClient.request(request.method, request.url, headers);

    request.on('data', function(chunk) {
        remoteRequest.write(chunk);
    });

    request.on('end', function() {
        remoteRequest.end();
    });

    remoteRequest.on('response', function (remoteResponse){         
        var body_regexp = new RegExp("<head>"); // regex to find first head tag
        var href_regexp = new RegExp('\<a href="(.*)"', 'g'); // regex to find hrefs

        response.writeHead(remoteResponse.statusCode, remoteResponse.headers);

        remoteResponse.on('data', function (chunk) {
    var body = doDecompress(new compress.GunzipStream(), chunk);
            body = body.replace(body_regexp, "<head><base href=\"http://"+ iframe_url +"/\">");
            body = body.replace(href_regexp, '<a href="#" onclick="javascript:return false;"');             

            response.write(body, 'binary');
        });

        remoteResponse.on('end', function() {

            response.end();
            });
        });
    }
};

en la parte del cuerpo var i quiere leer el cuerpo y por ejemplo en este caso eliminar todos hrefs reemplazándolos con un #. El problema aquí, por supuesto, es cuando tenemos un sitio que es codificada gzip / comprimido es todo jibberish y no podemos aplicar las expresiones regulares.

Ahora que ya he cansado para perder el tiempo con el módulo de nodo a comprimir:

 doDecompress(new compress.GunzipStream(), chunk);

que se refiere a

function doDecompress(decompressor, input) {
  var d1 = input.substr(0, 25);
  var d2 = input.substr(25);

  sys.puts('Making decompression requests...');
  var output = '';
  decompressor.setInputEncoding('binary');
  decompressor.setEncoding('utf8');
  decompressor.addListener('data', function(data) {
    output += data;
  }).addListener('error', function(err) {
    throw err;
  }).addListener('end', function() {
    sys.puts('Decompressed length: ' + output.length);
    sys.puts('Raw data: ' + output);
  });
  decompressor.write(d1);
  decompressor.write(d2);
  decompressor.close();
  sys.puts('Requests done.');
}

pero falla en él desde la entrada trozo es un objeto, así que he intentado suministrar como un chunk.toString (), que también produce un error con los datos de entrada no válidos.

Me estaba preguntando si estoy en absoluto encabezado en la dirección correcta?

¿Fue útil?

Solución

El descompresor espera de entrada codificada binaria. El trozo que recibe su respuesta es una instancia de Buffer qué método toString() hace por defecto le dan una parte posterior cadena codificada UTF-8.

Así que hay que usar chunk.toString('binary') para hacer que funcione, esto también puede ser visto en el demostración .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top