Question

Je suis actuellement en train de travailler sur un serveur proxy où nous sommes dans ce cas de modifier les données (à l'aide de regexp) que nous pousser à travers elle.

Dans la plupart des cas, il fonctionne bien sauf pour les sites web qui utilisent gzip comme encodage de contenu (je pense), je suis venu à travers un module appelé compresser et tenté de repousser les morceaux que je reçois par le biais d'un décompresser / gunzip flux, mais il n'est pas vraiment en tournant comme je l'espérais.(voir ci-dessous pour le code)

pensé que j'avais poster quelques code pour prendre en charge mon problème, c'est le proxy qui est chargé avec 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();
            });
        });
    }
};

dans le var, partie du corps que je veux lire le corps et par exemple, dans ce cas, supprimez tous les hrefs en les remplaçant par un #.Le problème ici est, bien sûr, lorsque nous avons un site qui est gzip codé/ compressé c'est tout jibberish et nous ne pouvons pas appliquer les expressions régulières.

maintenant, je l'ai déjà fatigué pour déconner avec le noeud-compresser module:

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

qui se réfère à

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

Mais il échoue sur elle depuis le bloc d'entrée est un objet, alors j'ai essayé de les fournir comme un bloc.toString() qui échoue également avec des données d'entrée non valides.

Je me demandais si je suis, à tout va dans la bonne direction?

Était-ce utile?

La solution

Le décompresseur attend binaire codé d'entrée.Le morceau que votre réponse reçoit est une instance de Tampon qui toString() la méthode par défaut de vous donner un codés en UTF-8 chaîne de retour.

Donc, vous avez à utiliser chunk.toString('binary') pour le faire fonctionner, cela peut aussi être vu dans l' démo.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top