92 lines
2.6 KiB
JavaScript
92 lines
2.6 KiB
JavaScript
const CC = Components.Constructor;
|
|
|
|
let { setTimeout } = ChromeUtils.importESModule(
|
|
"resource://gre/modules/Timer.sys.mjs"
|
|
);
|
|
|
|
const LocalFile = CC("@mozilla.org/file/local;1", "nsIFile", "initWithPath");
|
|
|
|
const FileInputStream = CC(
|
|
"@mozilla.org/network/file-input-stream;1",
|
|
"nsIFileInputStream",
|
|
"init"
|
|
);
|
|
|
|
const BinaryInputStream = CC(
|
|
"@mozilla.org/binaryinputstream;1",
|
|
"nsIBinaryInputStream",
|
|
"setInputStream"
|
|
);
|
|
|
|
function handleRequest(request, response) {
|
|
let params = parseQueryString(request.queryString);
|
|
|
|
response.setStatusLine(request.httpVersion, 200, "OK");
|
|
|
|
// Compare and increment a cookie for this request. This is used to test
|
|
// private browsing mode; the cookie should not be set if the image is
|
|
// loaded anonymously.
|
|
if (params.has("c")) {
|
|
let expectedValue = parseInt(params.get("c"), 10);
|
|
let actualValue = !request.hasHeader("Cookie")
|
|
? 0
|
|
: parseInt(
|
|
request.getHeader("Cookie").replace(/^counter=(\d+)/, "$1"),
|
|
10
|
|
);
|
|
if (actualValue != expectedValue) {
|
|
response.setStatusLine(request.httpVersion, 400, "Wrong counter value");
|
|
return;
|
|
}
|
|
response.setHeader("Set-Cookie", `counter=${expectedValue + 1}`, false);
|
|
}
|
|
|
|
// Wait to send the image if a timeout is given.
|
|
let timeout = parseInt(params.get("t"), 10);
|
|
if (timeout > 0) {
|
|
response.processAsync();
|
|
setTimeout(() => {
|
|
respond(params, request, response);
|
|
response.finish();
|
|
}, timeout * 1000);
|
|
return;
|
|
}
|
|
|
|
respond(params, request, response);
|
|
}
|
|
|
|
function parseQueryString(queryString) {
|
|
return queryString.split("&").reduce((params, param) => {
|
|
let [key, value] = param.split("=", 2);
|
|
params.set(key, value);
|
|
return params;
|
|
}, new Map());
|
|
}
|
|
|
|
function respond(params, request, response) {
|
|
if (params.has("s")) {
|
|
let statusCode = parseInt(params.get("s"), 10);
|
|
response.setStatusLine(request.httpVersion, statusCode, "Custom status");
|
|
return;
|
|
}
|
|
var filename = params.get("f");
|
|
writeFile(filename, response);
|
|
}
|
|
|
|
function writeFile(name, response) {
|
|
var file = new LocalFile(getState("__LOCATION__")).parent;
|
|
file.append(name);
|
|
|
|
let mimeType = Cc["@mozilla.org/uriloader/external-helper-app-service;1"]
|
|
.getService(Ci.nsIMIMEService)
|
|
.getTypeFromFile(file);
|
|
|
|
let fileStream = new FileInputStream(file, 1, 0, false);
|
|
let binaryStream = new BinaryInputStream(fileStream);
|
|
|
|
response.setHeader("Content-Type", mimeType, false);
|
|
response.bodyOutputStream.writeFrom(binaryStream, binaryStream.available());
|
|
|
|
binaryStream.close();
|
|
fileStream.close();
|
|
}
|