Подтвердить что ты не робот

Nodejs: конвертировать строку в буфер

Я пытаюсь записать строку в сокет (сокет называется "ответ" ). Вот код, который у меня есть 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-данных.

Любое понимание очень ценится.

Большое спасибо заранее,

4b9b3361

Ответ 1

Не углубляясь в свой код, мне кажется, что вы можете изменить

var responseData=x.toString();

к

var responseData=x.toString("binary");

и, наконец,

response.write(new Buffer(toTransmit, "binary"));

Ответ 3

Из документов:

Pure Javascript является Unicode дружественным, но не хорош для двоичных данных. когда работа с TCP-потоками или файловой системой, необходимо обрабатывать октетные потоки. Node имеет несколько стратегий для манипулирования, создания, и потребляя потоки октета.

Сырые данные хранятся в экземплярах класса Buffer. Буфер - это подобно массиву целых чисел, но соответствует необработанной памяти выделение вне кучи V8. Буфер не может быть изменен.

Итак, не используйте строки для обработки двоичных данных.

Измените proxy_request.write(chunk, 'binary'); на proxy_request.write(chunk);.

Опустить var responseData=x.toString();, что плохая идея.

Вместо выполнения substr в строке используйте slice в буфере.

Вместо выполнения + со строками используйте метод "concat" из buffertools.