Frage

Ich arbeite derzeit an einem Proxyserver, auf dem wir in diesem Fall die Daten (mithilfe von Regexp) ändern müssen, die wir durch ihn übertragen.

In den meisten Fällen funktioniert es gut, außer bei Websites, die gzip als Inhaltskodierung verwenden (glaube ich), ich bin auf ein Modul namens gestoßen Kompresse und habe versucht, die Brocken, die ich erhalte, über einen Dekomprimierungs-/Gunzip-Stream zu übertragen, aber es läuft nicht wirklich so, wie ich es erwartet hatte.(Code siehe unten)

Ich dachte, ich würde etwas Code posten, um mein Problem zu unterstützen. Dies ist der Proxy, der mit MVC (Express) geladen wird:

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

Im var-Körperteil möchte ich den Körper lesen und in diesem Fall beispielsweise alle hrefs entfernen, indem ich sie durch ein # ersetze.Das Problem hierbei ist natürlich, dass, wenn wir eine Site haben, die gzip-codiert/komprimiert ist, alles nur Kauderwelsch ist und wir die regulären Ausdrücke nicht anwenden können.

Jetzt habe ich es schon satt, mit dem Node-Compress-Modul herumzuspielen:

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

was sich darauf bezieht

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-Eingabe ein Objekt ist, also habe ich versucht, es als chunk.toString() anzugeben, was ebenfalls mit ungültigen Eingabedaten fehlschlägt.

Ich habe mich gefragt, ob ich überhaupt in die richtige Richtung gehe?

War es hilfreich?

Lösung

Der Dekomprimierer erwartet binär codierte Eingaben.Der Block, den Ihre Antwort erhält, ist eine Instanz von Puffer welche toString() Die Methode gibt Ihnen standardmäßig eine UTF-8-codierte Zeichenfolge zurück.

Man muss es also nutzen chunk.toString('binary') Damit es funktioniert, ist dies auch in der zu sehen Demo.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top