Я пытаюсь записать строку в сокет (сокет называется "ответ" ). Вот код, который у меня есть sofar (я пытаюсь реализовать байтовый кеширующий прокси...):
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;
}
Проблема в том, что я продолжаю получать "ошибку кодирования контента" в Firefox. Это как если бы содержимое gizipped не передавалось должным образом. Я гарантировал, что "toTransmit" совпадает с "x" через console.log(x) и console.log(toTransmit).
Стоит отметить, что если я заменяю response.write(new Buffer(toTransmit))
просто response.write(x)
, прокси работает так, как ожидалось, но мне нужно сделать некоторый анализ полезной нагрузки, а затем передать "toTransmit", а не "x".
Я также попытался response.write(toTransmit)
(т.е. без преобразования в буфер), и я продолжаю получать ту же ошибку кодирования содержимого.
Я действительно застрял. Я думал, что эта проблема исправлена путем преобразования строки в буфер в соответствии с другим потоком (http://stackoverflow.com/info/7090510/nodejs-content-encoding-error), но я снова открыл новый поток чтобы обсудить эту новую проблему, которую я испытываю.
Я должен добавить, что если я открою страницу через прокси-сервер в Opera, я получаю gobblydeegook - это похоже на повреждение gzipped-данных.
Любое понимание очень ценится.
Большое спасибо заранее,