Скрипт Nodejs Proxy, не работает с mod_deflate - PullRequest
3 голосов
/ 04 сентября 2010

Я создал небольшой скрипт прокси-узла, который ищет request.url и либо передает запрос на мой сервер Apache, либо использует узел для процесс / ответ на этот запрос. Я был успешным до сих пор, все работает нормально, но когда я включаю mod_deflate для apache, "странные вещи произойдут".

Похоже, что узел просто "отменяет" или "останавливает" ответ на ранний путь. Я слушаю событие "data" из моего запроса, и в какой-то момент узел просто решает, что ответ закончился (что неверно) и запускает событие "конец".

Фрагмент кода:

var apache = http.createClient(82, 'localhost');

function pass_to_apache(req, res){
    var request = apache.request(req.method, req.url, req.headers);

    req.addListener('end', function() {
        request.end();
    });

    req.addListener('data', function(chunk) {
        request.write(chunk);
        sys.puts('writting chunk\n');
    });

    request.addListener('response', function(response) {
        res.writeHead(response.statusCode, response.headers);
        response.addListener('data', function(chunk) {
            sys.puts('writting data..\n');
            res.write(chunk);
        });
        response.addListener('end', function() {
            sys.puts('end of request');
            res.end();
        });
    });
}

var MainServer = http.createServer(function(request, response) {
    sys.puts('received '+request.method+' '+request.url + "\n"+JSON.stringify(request.headers));
    if(/^\/node/.test(request.url)) {
        response.writeHead(200, {'Content-Type': 'text/plain'});
        response.end("Hi, it's node =)\n");
    }
    else if(/^\/exit/.test(request.url)) {
        sys.puts('closing..\n');
        MainServer.close();
        throw new Error('forced');
    }
    else {
        pass_to_apache(request, response);
    }
});

MainServer.listen(80, 'typeofnan.com');

Вы можете «увидеть» это в действии на www.typeofnan.com && www.typeofnan.com / node / everything
edit: пока отключен nodejs.

Помните, это работает как талисман, если gzip / deflate не используется апач. Я попытался установить кодировку "бинарный" в моем ответе, но нет успех тоже.

Я что-то здесь упускаю? Может ли кто-нибудь подтвердить это поведение? Я использую последнюю версию (0.2.0).

Возможно, есть другое (лучшее) решение для использования проксискрипта, подобного этому?

1 Ответ

0 голосов
/ 13 сентября 2010

Я заинтригован. Я запустил ваш код и указал на www.typeofnan.com. Это работало нормально, но я заметил, что сервер не возвращает сжатые ответы. Затем я установил его на прокси-сервер apache.org, и мой браузер также хорошо отобразил его с помощью сжатого содержимого! Для получения «/» я получил следующие заголовки ответа:

{"date":"Mon, 13 Sep 2010 11:03:45 GMT","server":"Apache/2.3.8 (Unix) mod_ssl/2.3.8 OpenSSL/1.0.0a","last-modified":"Sat, 11 Sep 2010 19:38:09 GMT","etag":"\"c9489a-4ada-4900100c32a40-gzip\"","accept-ranges":"bytes","vary":"Accept-Encoding","content-encoding":"gzip","cache-control":"max-age=86400","expires":"Tue, 14 Sep 2010 11:03:45 GMT","content-length":"5359","keep-alive":"timeout=5, max=100","connection":"Keep-Alive","content-type":"text/html"}

Хммм ... разве мне просто повезло, и я не получил сжатый ответ, вызвавший твои проблемы? У вас есть страница, которая надежно вызывает "странные вещи", с которыми я мог бы протестировать? На самом деле, вам может понадобиться определить «странные вещи произойдут»:)

Как хак, вы можете заставить свой прокси изменить заголовок accept-encoding , чтобы apache никогда не возвращал сжатый ответ. Добавление следующего в ваш запрос apache заставит apache возвращать несжатые ответы:

req.headers['accept-encoding'] = '*;q=1,gzip=0';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...