blob: bf4f70edbbc022cf125951c49de51b680dcbcce1 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
Components.utils.import("resource://gre/modules/Services.jsm");
const Ci = Components.interfaces;
const Cc = Components.classes;
const reportURI = "http://mochi.test:8888/foo.sjs";
var openingObserver = {
observe: function(subject, topic, data) {
// subject should be an nsURI
if (subject.QueryInterface == undefined)
return;
var message = {report: "", error: false};
if (topic == 'http-on-opening-request') {
var asciiSpec = subject.QueryInterface(Ci.nsIHttpChannel).URI.asciiSpec;
if (asciiSpec !== reportURI) return;
var reportText = false;
try {
// Verify that the report was properly formatted.
// We'll parse the report text as JSON and verify that the properties
// have expected values.
var reportText = "{}";
var uploadStream = subject.QueryInterface(Ci.nsIUploadChannel).uploadStream;
if (uploadStream) {
// get the bytes from the request body
var binstream = Cc["@mozilla.org/binaryinputstream;1"].createInstance(Ci.nsIBinaryInputStream);
binstream.setInputStream(uploadStream);
var segments = [];
for (var count = uploadStream.available(); count; count = uploadStream.available()) {
var data = binstream.readBytes(count);
segments.push(data);
}
var reportText = segments.join("");
// rewind stream as we are supposed to - there will be an assertion later if we don't.
uploadStream.QueryInterface(Ci.nsISeekableStream).seek(Ci.nsISeekableStream.NS_SEEK_SET, 0);
}
message.report = reportText;
} catch (e) {
message.error = e.toString();
}
sendAsyncMessage('opening-request-completed', message);
Services.obs.removeObserver(openingObserver, 'http-on-opening-request');
}
}
};
Services.obs.addObserver(openingObserver, 'http-on-opening-request', false);
|