Node.js proxy, Umgang mit gzip-Dekomprimierung

Ich bin momentan an einem proxy-server, wo wir in diesem Fall müssen die Daten ändern (mit regexp), dass wir schieben durch.

In den meisten Fällen, es funktioniert gut, außer für Webseiten mit gzip als content-encoding (glaube ich) habe ich über ein Modul namens komprimieren und versucht, schieben Sie die Stücke, die ich erhalten durch eine Dekomprimieren /entpacken stream aber es ist nicht wirklich den Dreh raus wie ich es erwartet habe. (siehe unten code)

dachte, ich würde post einige code-support mein prob, das ist der proxy, der geladen wird mit mvc (express):

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

in der var Körperteil, das ich Lesen will, den Körper und zum Beispiel in diesem Fall entfernen Sie alle hrefs, indem Sie Sie mit einem #. Das problem hier ist natürlich, wenn wir eine Webseite, die gzip-codiert/komprimiert, es ist alles jibberish und wir können nicht für die regexps.

jetzt hab ich schon wieder müde, zu Durcheinander herum mit den Knoten-compress-Modul:

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

bezieht sich auf

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.');
}

Aber es schlägt fehl, da die chunk-Eingang wird ein Objekt, also habe ich versucht zu liefern als ein chunk.toString (), die auch nicht mit ungültigen Eingabedaten.

Wurde ich gefragt, ob ich überhaupt in die richtige Richtung?

InformationsquelleAutor M0rph3v5 | 2011-01-04
Schreibe einen Kommentar