Nodejs: convertit la chaîne en tampon

Je suis en train d'écrire une chaîne de caractères à un socket (socket est appelée "réponse"). Voici le code que j'ai jusqu'à présent (je suis en train de mettre en œuvre un octet de la mise en cache du proxy...):

var http = require('http');
var sys=require('sys');

var localHash={};

http.createServer(function(request, response) {
    var proxy = http.createClient(80, request.headers['host'])
    var proxy_request = proxy.request(request.method, request.url, request.headers);
    proxy_request.addListener('response', function (proxy_response) {
    proxy_response.addListener('data', function(x) {
        var responseData=x.toString();
        var f=50;
        var toTransmit="";
        var p=0;        

        var N=responseData.length;
        if(N>f){
            p=Math.floor(N/f);

            var hash="";
            var chunk="";
            for(var i=0;i<p;i++){
                chunk=responseData.substr(f*i,f);
                hash=DJBHash(chunk);
                if(localHash[hash]==undefined){
                    localHash[hash]=chunk;
                    toTransmit=toTransmit+chunk;
                }else{
                    sys.puts("***hit"+chunk);
                    toTransmit=toTransmit+chunk;//"***EOH"+hash;
                }
            }
            //remainder:
            chunk=responseData.substr(f*p);
            hash=DJBHash(chunk);
            if(localHash[hash]==undefined){
                localHash[hash]=chunk;
                toTransmit=toTransmit+chunk;
            }else{
                toTransmit=toTransmit+chunk;//"***EOH"+hash;
            }
        }else{
            toTransmit=responseData;
        }
        response.write(new Buffer(toTransmit));   /*error occurs here */
    });
    proxy_response.addListener('end', function() {
        response.end();
    });
    response.writeHead(proxy_response.statusCode, proxy_response.headers);
    });
    request.addListener('data', function(chunk) {
        sys.puts(chunk);
        proxy_request.write(chunk, 'binary');
    });
    request.addListener('end', function() {
        proxy_request.end();
    });
}).listen(8080);



function DJBHash(str) {
    var hash = 5381;
    for(var i = 0; i < str.length; i++) {
        hash = (((hash << 5) + hash) + str.charCodeAt(i)) & 0xffffffff;
    }
    if(hash<-1){
        hash=hash*-1;
    }
    return hash;
}

Le problème est que je reçois un "contenu de l'erreur de codage" dans Firefox. C'est comme si le gizipped contenu n'est pas transmis correctement. J'ai veillé à ce que "toTransmit" est le même que le "x" par la console.log(x) et la console.log(toTransmit).

Il est intéressant de noter que si je remplace response.write(new Buffer(toTransmit)) avec simplement response.write(x)le proxy fonctionne comme prévu, mais j'ai besoin de faire des analyse de charge utile et de passer ensuite "toTransmit", pas de "x".

J'ai aussi essayé de response.write(toTransmit) (c'est à dire sans la conversion de tampon) et je reçois le même contenu de l'erreur de codage.

Je suis vraiment coincé. J'ai pensé que j'ai eu ce problème résolu par la conversion de la chaîne en mémoire tampon par un autre thread (http://stackoverflow.com/questions/7090510/nodejs-content-encoding-error), mais j'ai ré-ouvert un nouveau fil de discussion pour discuter de ce nouveau problème, je suis en train de vivre.

Je dois ajouter que si j'ouvre une page via le serveur proxy Opera, je reçois gobblydeegook - c'est comme si le format de données est corrompu.

Toute réflexion grandement apprécié.

Merci beaucoup à l'avance,

source d'informationauteur Eamorr

Leave a Reply

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *