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
Vous devez vous connecter pour publier un commentaire.
Sans creuser très profondément dans votre code, il me semble que vous pourriez vouloir changer
à
et enfin
Comment à ce sujet?
à partir de: Convertit une chaîne de Nœud tampon
À partir de la documentation:
Donc, ne pas utiliser de chaînes pour le traitement des données binaires.
Changement
proxy_request.write(chunk, 'binary');
àproxy_request.write(chunk);
.Omettre
var responseData=x.toString();
c'est une mauvaise idée.Au lieu de faire
substr
sur une chaîne, utilisezslice
sur un tampon.Au lieu de faire
+
avec des chaînes de caractères, utilisez le "concat" méthode de la buffertools.