Изменить сжатый HTML-ответ от узла-http-прокси

0

Проблема:

Модификация ответа Gzipped HTML дает белый экран при использовании прокси-узла node-http-proxy для запросов к брандмауэру.

Что я до сих пор:

Мой метод перехвата запросов и модификация html (см. Ниже) хорошо работает для всех запросов, которые НЕ Gzipped. (Я тестировал серверы узла, ruby, PHP и apache).

Запутанная часть:

У меня есть набор тестов, который запускает прокси-сервер и запрашивает его. Если я console.log ответ, я могу ясно видеть, что HTML был изменен - просто он не будет отображаться в браузере вообще...

Настройка прокси-сервера

var server = httpProxy.createServer(function (req, res, proxy) {

    var next = function () {
        proxy.proxyRequest(req, res, {
            host: "172.22.22.22",
            port: 80,
            changeOrigin: true
        });
    };

    var write = res.write;

    res.write = function (string, encoding) {

        var body = string instanceof Buffer ? string.toString() : string;

        body = body.replace(/<\/body>/, function (w) {
            return "<script>console.log('injected')</script>\n" + w;
        });

        if (string instanceof Buffer) {
            string = new Buffer(body);
        } else {
            string = body;
        }

        write.call(res, string, encoding);
    };

    next();

}).listen(3002);

// Remove content-length, defaults to 'chunked'
server.proxy.on("proxyResponse", function (req, res, response) {
    if (response.headers.hasOwnProperty("content-length")) {
        delete response.headers["content-length"];
    }
});

Мой тестовый пример с корректно измененным HTML

it("can modify the html response", function (done) {
    var data;
    http.get(proxyHost, function (res) {
        var chunks = [];
        res.on("data", function (chunk) {
            chunks.push(chunk.toString());
        });
        res.on("end", function () {
            data = chunks.join("");
            console.log(data); // snippet can be seen in this response
            done();
        });
    });
});

Есть идеи?

Теги:
proxy

1 ответ

0

Я решил эту проблему.

Не удается загрузить источник, но я могу дать вам несколько советов по этому вопросу.

  1. используйте server.proxy.on("proxyResponse" для проверки содержимого
  2. ничего не делайте, но собирайте кусок на res.write
  3. на res.end, zlib.unzip собрал куски, если кодировка содержимого была "gzip", а затем oldWrite.call(res, decoded_string), oldEnd.apply(res, arguments)
  4. если вы хотите что-то изменить, делайте это, пока # 3

Надеюсь, это поможет тебе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню