Bug 1576768 - Automatically format .sjs files using prettier. r=Standard8,agi,zombie,extension-reviewers
# ignore-this-changeset Differential Revision: https://phabricator.services.mozilla.com/D128482
This commit is contained in:
@@ -12,7 +12,10 @@ const IMG_BYTES = atob(
|
|||||||
|
|
||||||
// stolen from file_blocked_script.sjs
|
// stolen from file_blocked_script.sjs
|
||||||
function setGlobalState(data, key) {
|
function setGlobalState(data, key) {
|
||||||
x = { data: data, QueryInterface: function(iid) { return this } };
|
x = {
|
||||||
|
data,
|
||||||
|
QueryInterface: ChromeUtils.generateQI([]),
|
||||||
|
};
|
||||||
x.wrappedJSObject = x;
|
x.wrappedJSObject = x;
|
||||||
setObjectState(key, x);
|
setObjectState(key, x);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,11 @@
|
|||||||
|
|
||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
// let's enjoy the amazing CSP setting
|
// let's enjoy the amazing CSP setting
|
||||||
response.setHeader("Content-Security-Policy", "frame-ancestors 'self'", false);
|
response.setHeader(
|
||||||
|
"Content-Security-Policy",
|
||||||
|
"frame-ancestors 'self'",
|
||||||
|
false
|
||||||
|
);
|
||||||
|
|
||||||
// let's avoid caching issues
|
// let's avoid caching issues
|
||||||
response.setHeader("Pragma", "no-cache");
|
response.setHeader("Pragma", "no-cache");
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
const CC = Components.Constructor;
|
const CC = Components.Constructor;
|
||||||
const BinaryInputStream = CC("@mozilla.org/binaryinputstream;1",
|
const BinaryInputStream = CC(
|
||||||
|
"@mozilla.org/binaryinputstream;1",
|
||||||
"nsIBinaryInputStream",
|
"nsIBinaryInputStream",
|
||||||
"setInputStream");
|
"setInputStream"
|
||||||
|
);
|
||||||
|
|
||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
response.setHeader("Content-Type", "text/plain", false);
|
response.setHeader("Content-Type", "text/plain", false);
|
||||||
@@ -13,8 +15,9 @@ function handleRequest(request, response) {
|
|||||||
var avail;
|
var avail;
|
||||||
var bytes = [];
|
var bytes = [];
|
||||||
|
|
||||||
while ((avail = body.available()) > 0)
|
while ((avail = body.available()) > 0) {
|
||||||
Array.prototype.push.apply(bytes, body.readByteArray(avail));
|
Array.prototype.push.apply(bytes, body.readByteArray(avail));
|
||||||
|
}
|
||||||
|
|
||||||
var data = String.fromCharCode.apply(null, bytes);
|
var data = String.fromCharCode.apply(null, bytes);
|
||||||
response.bodyOutputStream.write(data, data.length);
|
response.bodyOutputStream.write(data, data.length);
|
||||||
|
|||||||
@@ -13,7 +13,8 @@ function handleRequest(request, response) {
|
|||||||
response.setStatusLine(request.httpVersion, 200);
|
response.setStatusLine(request.httpVersion, 200);
|
||||||
|
|
||||||
response.setHeader("Content-Type", "text/html", false);
|
response.setHeader("Content-Type", "text/html", false);
|
||||||
let txt = "<html><head><title>XFO page</title></head>" +
|
let txt =
|
||||||
|
"<html><head><title>XFO page</title></head>" +
|
||||||
"<body><h1>" +
|
"<body><h1>" +
|
||||||
"XFO blocked page opened in new window!" +
|
"XFO blocked page opened in new window!" +
|
||||||
"</h1></body></html>";
|
"</h1></body></html>";
|
||||||
|
|||||||
@@ -17,6 +17,9 @@ function handleRequest(request, response) {
|
|||||||
|
|
||||||
response.setStatusLine(request.httpVersion, 302, "Moved Temporarily");
|
response.setStatusLine(request.httpVersion, 302, "Moved Temporarily");
|
||||||
response.setHeader("Set-Cookie", `faviconCookie=${++state}`);
|
response.setHeader("Set-Cookie", `faviconCookie=${++state}`);
|
||||||
response.setHeader("Location", "http://example.com/browser/browser/base/content/test/favicons/moz.png");
|
response.setHeader(
|
||||||
|
"Location",
|
||||||
|
"http://example.com/browser/browser/base/content/test/favicons/moz.png"
|
||||||
|
);
|
||||||
setState("cache_cookie", `${state}`);
|
setState("cache_cookie", `${state}`);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,8 +2,7 @@
|
|||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
let page = "<!DOCTYPE html><html><body><p>HSTS page</p></body></html>";
|
let page = "<!DOCTYPE html><html><body><p>HSTS page</p></body></html>";
|
||||||
response.setStatusLine(request.httpVersion, "200", "OK");
|
response.setStatusLine(request.httpVersion, "200", "OK");
|
||||||
response.setHeader("Strict-Transport-Security", "max-age=60");
|
response.setHeader("Strict-Transport-Security", "max-age=60");
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
function handleRequest(aRequest, aResponse) {
|
function handleRequest(aRequest, aResponse) {
|
||||||
aResponse.setStatusLine(aRequest.httpVersion, 200);
|
aResponse.setStatusLine(aRequest.httpVersion, 200);
|
||||||
if (aRequest.hasHeader('Cookie')) {
|
if (aRequest.hasHeader("Cookie")) {
|
||||||
aResponse.write("cookie-present");
|
aResponse.write("cookie-present");
|
||||||
} else {
|
} else {
|
||||||
aResponse.setHeader("Set-Cookie", "foopy=1");
|
aResponse.setHeader("Set-Cookie", "foopy=1");
|
||||||
|
|||||||
@@ -2,20 +2,17 @@
|
|||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
let page = "download";
|
let page = "download";
|
||||||
response.setStatusLine(request.httpVersion, "200", "OK");
|
response.setStatusLine(request.httpVersion, "200", "OK");
|
||||||
|
|
||||||
let [first, second] = request.queryString.split('=');
|
let [first, second] = request.queryString.split("=");
|
||||||
let headerStr = first;
|
let headerStr = first;
|
||||||
if (second !== "none") {
|
if (second !== "none") {
|
||||||
headerStr += "; filename=" + second;
|
headerStr += "; filename=" + second;
|
||||||
}
|
}
|
||||||
|
|
||||||
response.setHeader(
|
response.setHeader("Content-Disposition", headerStr);
|
||||||
"Content-Disposition",
|
|
||||||
headerStr);
|
|
||||||
response.setHeader("Content-Type", "text/plain", false);
|
response.setHeader("Content-Type", "text/plain", false);
|
||||||
response.setHeader("Content-Length", page.length + "", false);
|
response.setHeader("Content-Length", page.length + "", false);
|
||||||
response.write(page);
|
response.write(page);
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
const CC = Components.Constructor;
|
const CC = Components.Constructor;
|
||||||
const BinaryInputStream = CC("@mozilla.org/binaryinputstream;1",
|
const BinaryInputStream = CC(
|
||||||
|
"@mozilla.org/binaryinputstream;1",
|
||||||
"nsIBinaryInputStream",
|
"nsIBinaryInputStream",
|
||||||
"setInputStream");
|
"setInputStream"
|
||||||
|
);
|
||||||
|
|
||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
response.setHeader("Content-Type", "text/plain", false);
|
response.setHeader("Content-Type", "text/plain", false);
|
||||||
@@ -13,8 +15,9 @@ function handleRequest(request, response) {
|
|||||||
var avail;
|
var avail;
|
||||||
var bytes = [];
|
var bytes = [];
|
||||||
|
|
||||||
while ((avail = body.available()) > 0)
|
while ((avail = body.available()) > 0) {
|
||||||
Array.prototype.push.apply(bytes, body.readByteArray(avail));
|
Array.prototype.push.apply(bytes, body.readByteArray(avail));
|
||||||
|
}
|
||||||
|
|
||||||
var data = String.fromCharCode.apply(null, bytes);
|
var data = String.fromCharCode.apply(null, bytes);
|
||||||
response.bodyOutputStream.write(data, data.length);
|
response.bodyOutputStream.write(data, data.length);
|
||||||
|
|||||||
@@ -5,5 +5,7 @@ function handleRequest(request, response) {
|
|||||||
response.setStatusLine("1.1", 302, "Found");
|
response.setStatusLine("1.1", 302, "Found");
|
||||||
response.setHeader(
|
response.setHeader(
|
||||||
"Location",
|
"Location",
|
||||||
`download_with_content_disposition_header.sjs?${queryStr}`, false);
|
`download_with_content_disposition_header.sjs?${queryStr}`,
|
||||||
|
false
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,8 +25,12 @@ function handleRequest(req, resp) {
|
|||||||
|
|
||||||
let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
|
let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
|
||||||
resp.write(AUTOPLAY_HTML);
|
resp.write(AUTOPLAY_HTML);
|
||||||
timer.init(() => {
|
timer.init(
|
||||||
|
() => {
|
||||||
resp.write("");
|
resp.write("");
|
||||||
resp.finish();
|
resp.finish();
|
||||||
}, DELAY_MS, Ci.nsITimer.TYPE_ONE_SHOT);
|
},
|
||||||
|
DELAY_MS,
|
||||||
|
Ci.nsITimer.TYPE_ONE_SHOT
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,13 +4,17 @@
|
|||||||
|
|
||||||
// A 1x1 PNG image.
|
// A 1x1 PNG image.
|
||||||
// Source: https://commons.wikimedia.org/wiki/File:1x1.png (Public Domain)
|
// Source: https://commons.wikimedia.org/wiki/File:1x1.png (Public Domain)
|
||||||
const IMAGE = atob("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAA" +
|
const IMAGE = atob(
|
||||||
"ACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=");
|
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAA" +
|
||||||
|
"ACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII="
|
||||||
|
);
|
||||||
|
|
||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
response.setStatusLine(request.httpVersion, 200);
|
response.setStatusLine(request.httpVersion, 200);
|
||||||
if (request.queryString &&
|
if (
|
||||||
request.queryString.includes("type=image-no-cookie")) {
|
request.queryString &&
|
||||||
|
request.queryString.includes("type=image-no-cookie")
|
||||||
|
) {
|
||||||
response.setHeader("Content-Type", "image/png", false);
|
response.setHeader("Content-Type", "image/png", false);
|
||||||
response.write(IMAGE);
|
response.write(IMAGE);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -3,8 +3,7 @@
|
|||||||
* Used in browser_referrer_*.js, bug 1113431.
|
* Used in browser_referrer_*.js, bug 1113431.
|
||||||
* Arguments: ?scheme=http://&policy=origin&rel=noreferrer
|
* Arguments: ?scheme=http://&policy=origin&rel=noreferrer
|
||||||
*/
|
*/
|
||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
Components.utils.importGlobalProperties(["URLSearchParams"]);
|
Components.utils.importGlobalProperties(["URLSearchParams"]);
|
||||||
let query = new URLSearchParams(request.queryString);
|
let query = new URLSearchParams(request.queryString);
|
||||||
|
|
||||||
@@ -14,11 +13,14 @@ function handleRequest(request, response)
|
|||||||
let cross = query.get("cross");
|
let cross = query.get("cross");
|
||||||
|
|
||||||
let host = cross ? "example.com" : "test1.example.com";
|
let host = cross ? "example.com" : "test1.example.com";
|
||||||
let linkUrl = scheme + host +
|
let linkUrl =
|
||||||
|
scheme +
|
||||||
|
host +
|
||||||
"/browser/browser/base/content/test/referrer/" +
|
"/browser/browser/base/content/test/referrer/" +
|
||||||
"file_referrer_testserver.sjs";
|
"file_referrer_testserver.sjs";
|
||||||
let metaReferrerTag =
|
let metaReferrerTag = policy
|
||||||
policy ? `<meta name='referrer' content='${policy}'>` : "";
|
? `<meta name='referrer' content='${policy}'>`
|
||||||
|
: "";
|
||||||
|
|
||||||
let html = `<!DOCTYPE HTML>
|
let html = `<!DOCTYPE HTML>
|
||||||
<html>
|
<html>
|
||||||
|
|||||||
@@ -3,8 +3,7 @@
|
|||||||
* Used in browser_referrer_*.js, bug 1113431.
|
* Used in browser_referrer_*.js, bug 1113431.
|
||||||
* Arguments: ?scheme=http://&policy=origin&rel=noreferrer
|
* Arguments: ?scheme=http://&policy=origin&rel=noreferrer
|
||||||
*/
|
*/
|
||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
Components.utils.importGlobalProperties(["URLSearchParams"]);
|
Components.utils.importGlobalProperties(["URLSearchParams"]);
|
||||||
let query = new URLSearchParams(request.queryString);
|
let query = new URLSearchParams(request.queryString);
|
||||||
|
|
||||||
@@ -14,12 +13,13 @@ function handleRequest(request, response)
|
|||||||
let cross = query.get("cross");
|
let cross = query.get("cross");
|
||||||
|
|
||||||
let host = cross ? "example.com" : "test1.example.com";
|
let host = cross ? "example.com" : "test1.example.com";
|
||||||
let linkUrl = scheme + host +
|
let linkUrl =
|
||||||
|
scheme +
|
||||||
|
host +
|
||||||
"/browser/browser/base/content/test/referrer/" +
|
"/browser/browser/base/content/test/referrer/" +
|
||||||
"file_referrer_testserver.sjs";
|
"file_referrer_testserver.sjs";
|
||||||
|
|
||||||
let referrerPolicy =
|
let referrerPolicy = policy ? `referrerpolicy="${policy}"` : "";
|
||||||
policy ? `referrerpolicy="${policy}"` : "";
|
|
||||||
|
|
||||||
let html = `<!DOCTYPE HTML>
|
let html = `<!DOCTYPE HTML>
|
||||||
<html>
|
<html>
|
||||||
@@ -28,7 +28,9 @@ function handleRequest(request, response)
|
|||||||
<title>Test referrer</title>
|
<title>Test referrer</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<a id='testlink' href='${linkUrl}' ${referrerPolicy} ${rel ? ` rel='${rel}'` : ""}>
|
<a id='testlink' href='${linkUrl}' ${referrerPolicy} ${
|
||||||
|
rel ? ` rel='${rel}'` : ""
|
||||||
|
}>
|
||||||
referrer test link</a>
|
referrer test link</a>
|
||||||
</body>
|
</body>
|
||||||
</html>`;
|
</html>`;
|
||||||
|
|||||||
@@ -2,8 +2,7 @@
|
|||||||
* Renders the HTTP Referer header up to the second path slash.
|
* Renders the HTTP Referer header up to the second path slash.
|
||||||
* Used in browser_referrer_*.js, bug 1113431.
|
* Used in browser_referrer_*.js, bug 1113431.
|
||||||
*/
|
*/
|
||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
let referrer = "";
|
let referrer = "";
|
||||||
try {
|
try {
|
||||||
referrer = request.getHeader("referer");
|
referrer = request.getHeader("referer");
|
||||||
@@ -12,7 +11,10 @@ function handleRequest(request, response)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Strip it past the first path slash. Makes tests easier to read.
|
// Strip it past the first path slash. Makes tests easier to read.
|
||||||
referrer = referrer.split("/").slice(0, 4).join("/");
|
referrer = referrer
|
||||||
|
.split("/")
|
||||||
|
.slice(0, 4)
|
||||||
|
.join("/");
|
||||||
|
|
||||||
let html = `<!DOCTYPE HTML>
|
let html = `<!DOCTYPE HTML>
|
||||||
<html>
|
<html>
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
var page = "<!DOCTYPE html><html><body>bug 906190</body></html>";
|
var page = "<!DOCTYPE html><html><body>bug 906190</body></html>";
|
||||||
var path = "https://test1.example.com/browser/browser/base/content/test/siteIdentity/";
|
var path =
|
||||||
|
"https://test1.example.com/browser/browser/base/content/test/siteIdentity/";
|
||||||
var url;
|
var url;
|
||||||
|
|
||||||
if (request.queryString.includes('bad-redirection=1')) {
|
if (request.queryString.includes("bad-redirection=1")) {
|
||||||
url = path + "this_page_does_not_exist.html";
|
url = path + "this_page_does_not_exist.html";
|
||||||
} else {
|
} else {
|
||||||
url = path + "file_bug906190_redirected.html";
|
url = path + "file_bug906190_redirected.html";
|
||||||
|
|||||||
@@ -1,14 +1,17 @@
|
|||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
var page = "<!DOCTYPE html><html><body>bug 418354 and bug 1082837</body></html>";
|
var page =
|
||||||
|
"<!DOCTYPE html><html><body>bug 418354 and bug 1082837</body></html>";
|
||||||
|
|
||||||
if (request.queryString === "script") {
|
if (request.queryString === "script") {
|
||||||
var redirect = "http://example.com/browser/browser/base/content/test/siteIdentity/test_mcb_redirect.js";
|
var redirect =
|
||||||
|
"http://example.com/browser/browser/base/content/test/siteIdentity/test_mcb_redirect.js";
|
||||||
response.setHeader("Cache-Control", "no-cache", false);
|
response.setHeader("Cache-Control", "no-cache", false);
|
||||||
} else if (request.queryString === "image_http") {
|
} else if (request.queryString === "image_http") {
|
||||||
var redirect = "http://example.com/tests/image/test/mochitest/blue.png";
|
var redirect = "http://example.com/tests/image/test/mochitest/blue.png";
|
||||||
response.setHeader("Cache-Control", "max-age=3600", false);
|
response.setHeader("Cache-Control", "max-age=3600", false);
|
||||||
} else if (request.queryString === "image_redirect_http_sjs") {
|
} else if (request.queryString === "image_redirect_http_sjs") {
|
||||||
var redirect = "http://example.com/browser/browser/base/content/test/siteIdentity/test_mcb_redirect.sjs?image_redirect_https";
|
var redirect =
|
||||||
|
"http://example.com/browser/browser/base/content/test/siteIdentity/test_mcb_redirect.sjs?image_redirect_https";
|
||||||
response.setHeader("Cache-Control", "max-age=3600", false);
|
response.setHeader("Cache-Control", "max-age=3600", false);
|
||||||
} else if (request.queryString === "image_redirect_https") {
|
} else if (request.queryString === "image_redirect_https") {
|
||||||
var redirect = "https://example.com/tests/image/test/mochitest/blue.png";
|
var redirect = "https://example.com/tests/image/test/mochitest/blue.png";
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
const HTTP_ORIGIN = "http://example.com";
|
const HTTP_ORIGIN = "http://example.com";
|
||||||
const HTTPS_ORIGIN = "https://example.com";
|
const HTTPS_ORIGIN = "https://example.com";
|
||||||
const URI_PATH = "/browser/browser/components/contextualidentity/test/browser/saveLink.sjs";
|
const URI_PATH =
|
||||||
|
"/browser/browser/components/contextualidentity/test/browser/saveLink.sjs";
|
||||||
|
|
||||||
Components.utils.importGlobalProperties(["URLSearchParams"]);
|
Components.utils.importGlobalProperties(["URLSearchParams"]);
|
||||||
|
|
||||||
@@ -11,7 +12,12 @@ function handleRequest(aRequest, aResponse) {
|
|||||||
if (params.has("UCI")) {
|
if (params.has("UCI")) {
|
||||||
aResponse.setStatusLine(aRequest.httpVersion, 200);
|
aResponse.setStatusLine(aRequest.httpVersion, 200);
|
||||||
aResponse.setHeader("Set-Cookie", "UCI=" + params.get("UCI"));
|
aResponse.setHeader("Set-Cookie", "UCI=" + params.get("UCI"));
|
||||||
aResponse.write("<html><body><a href='" + HTTPS_ORIGIN + URI_PATH + "?redirect=1' id='fff'>this is a link</a></body></html>");
|
aResponse.write(
|
||||||
|
"<html><body><a href='" +
|
||||||
|
HTTPS_ORIGIN +
|
||||||
|
URI_PATH +
|
||||||
|
"?redirect=1' id='fff'>this is a link</a></body></html>"
|
||||||
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -19,7 +25,11 @@ function handleRequest(aRequest, aResponse) {
|
|||||||
// if we are able to follow it.
|
// if we are able to follow it.
|
||||||
if (params.has("redirect")) {
|
if (params.has("redirect")) {
|
||||||
aResponse.setStatusLine(aRequest.httpVersion, 302, "Found");
|
aResponse.setStatusLine(aRequest.httpVersion, 302, "Found");
|
||||||
aResponse.setHeader("Location", HTTP_ORIGIN + URI_PATH + "?download=1", false);
|
aResponse.setHeader(
|
||||||
|
"Location",
|
||||||
|
HTTP_ORIGIN + URI_PATH + "?download=1",
|
||||||
|
false
|
||||||
|
);
|
||||||
aResponse.write("Redirect!");
|
aResponse.write("Redirect!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
var match;
|
var match;
|
||||||
var requestAuth = true;
|
var requestAuth = true;
|
||||||
|
|
||||||
@@ -9,23 +8,27 @@ function handleRequest(request, response)
|
|||||||
// at the beginning of the query string.
|
// at the beginning of the query string.
|
||||||
var query = "?" + request.queryString;
|
var query = "?" + request.queryString;
|
||||||
|
|
||||||
var expected_user = "test", expected_pass = "testpass", realm = "mochitest";
|
var expected_user = "test",
|
||||||
|
expected_pass = "testpass",
|
||||||
|
realm = "mochitest";
|
||||||
|
|
||||||
// user=xxx
|
// user=xxx
|
||||||
match = /[^_]user=([^&]*)/.exec(query);
|
match = /[^_]user=([^&]*)/.exec(query);
|
||||||
if (match)
|
if (match) {
|
||||||
expected_user = match[1];
|
expected_user = match[1];
|
||||||
|
}
|
||||||
|
|
||||||
// pass=xxx
|
// pass=xxx
|
||||||
match = /[^_]pass=([^&]*)/.exec(query);
|
match = /[^_]pass=([^&]*)/.exec(query);
|
||||||
if (match)
|
if (match) {
|
||||||
expected_pass = match[1];
|
expected_pass = match[1];
|
||||||
|
}
|
||||||
|
|
||||||
// realm=xxx
|
// realm=xxx
|
||||||
match = /[^_]realm=([^&]*)/.exec(query);
|
match = /[^_]realm=([^&]*)/.exec(query);
|
||||||
if (match)
|
if (match) {
|
||||||
realm = match[1];
|
realm = match[1];
|
||||||
|
}
|
||||||
|
|
||||||
// Look for an authentication header, if any, in the request.
|
// Look for an authentication header, if any, in the request.
|
||||||
//
|
//
|
||||||
@@ -34,51 +37,59 @@ function handleRequest(request, response)
|
|||||||
// This test only supports Basic auth. The value sent by the client is
|
// This test only supports Basic auth. The value sent by the client is
|
||||||
// "username:password", obscured with base64 encoding.
|
// "username:password", obscured with base64 encoding.
|
||||||
|
|
||||||
var actual_user = "", actual_pass = "", authHeader, authPresent = false;
|
var actual_user = "",
|
||||||
|
actual_pass = "",
|
||||||
|
authHeader,
|
||||||
|
authPresent = false;
|
||||||
if (request.hasHeader("Authorization")) {
|
if (request.hasHeader("Authorization")) {
|
||||||
authPresent = true;
|
authPresent = true;
|
||||||
authHeader = request.getHeader("Authorization");
|
authHeader = request.getHeader("Authorization");
|
||||||
match = /Basic (.+)/.exec(authHeader);
|
match = /Basic (.+)/.exec(authHeader);
|
||||||
if (match.length != 2)
|
if (match.length != 2) {
|
||||||
throw new Error("Couldn't parse auth header: " + authHeader);
|
throw new Error("Couldn't parse auth header: " + authHeader);
|
||||||
|
}
|
||||||
|
|
||||||
var userpass = base64ToString(match[1]); // no atob() :-(
|
var userpass = base64ToString(match[1]); // no atob() :-(
|
||||||
match = /(.*):(.*)/.exec(userpass);
|
match = /(.*):(.*)/.exec(userpass);
|
||||||
if (match.length != 3)
|
if (match.length != 3) {
|
||||||
throw new Error("Couldn't decode auth header: " + userpass);
|
throw new Error("Couldn't decode auth header: " + userpass);
|
||||||
|
}
|
||||||
actual_user = match[1];
|
actual_user = match[1];
|
||||||
actual_pass = match[2];
|
actual_pass = match[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't request authentication if the credentials we got were what we
|
// Don't request authentication if the credentials we got were what we
|
||||||
// expected.
|
// expected.
|
||||||
if (expected_user == actual_user &&
|
if (expected_user == actual_user && expected_pass == actual_pass) {
|
||||||
expected_pass == actual_pass) {
|
|
||||||
requestAuth = false;
|
requestAuth = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (requestAuth) {
|
if (requestAuth) {
|
||||||
response.setStatusLine("1.0", 401, "Authentication required");
|
response.setStatusLine("1.0", 401, "Authentication required");
|
||||||
response.setHeader("WWW-Authenticate", "basic realm=\"" + realm + "\"", true);
|
response.setHeader("WWW-Authenticate", 'basic realm="' + realm + '"', true);
|
||||||
} else {
|
} else {
|
||||||
response.setStatusLine("1.0", 200, "OK");
|
response.setStatusLine("1.0", 200, "OK");
|
||||||
}
|
}
|
||||||
|
|
||||||
response.setHeader("Content-Type", "application/xhtml+xml", false);
|
response.setHeader("Content-Type", "application/xhtml+xml", false);
|
||||||
response.write("<html xmlns='http://www.w3.org/1999/xhtml'>");
|
response.write("<html xmlns='http://www.w3.org/1999/xhtml'>");
|
||||||
response.write("<p>Login: <span id='ok'>" + (requestAuth ? "FAIL" : "PASS") + "</span></p>\n");
|
response.write(
|
||||||
|
"<p>Login: <span id='ok'>" +
|
||||||
|
(requestAuth ? "FAIL" : "PASS") +
|
||||||
|
"</span></p>\n"
|
||||||
|
);
|
||||||
response.write("<p>Auth: <span id='auth'>" + authHeader + "</span></p>\n");
|
response.write("<p>Auth: <span id='auth'>" + authHeader + "</span></p>\n");
|
||||||
response.write("<p>User: <span id='user'>" + actual_user + "</span></p>\n");
|
response.write("<p>User: <span id='user'>" + actual_user + "</span></p>\n");
|
||||||
response.write("<p>Pass: <span id='pass'>" + actual_pass + "</span></p>\n");
|
response.write("<p>Pass: <span id='pass'>" + actual_pass + "</span></p>\n");
|
||||||
response.write("</html>");
|
response.write("</html>");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// base64 decoder
|
// base64 decoder
|
||||||
//
|
//
|
||||||
// Yoinked from extensions/xml-rpc/src/nsXmlRpcClient.js because btoa()
|
// Yoinked from extensions/xml-rpc/src/nsXmlRpcClient.js because btoa()
|
||||||
// doesn't seem to exist. :-(
|
// doesn't seem to exist. :-(
|
||||||
/* Convert Base64 data to a string */
|
/* Convert Base64 data to a string */
|
||||||
|
/* eslint-disable prettier/prettier */
|
||||||
const toBinaryTable = [
|
const toBinaryTable = [
|
||||||
-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
|
-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
|
||||||
-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
|
-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
|
||||||
@@ -89,20 +100,22 @@ const toBinaryTable = [
|
|||||||
-1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
|
-1,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,-1, -1,-1,-1,-1
|
41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1
|
||||||
];
|
];
|
||||||
const base64Pad = '=';
|
/* eslint-enable prettier/prettier */
|
||||||
|
const base64Pad = "=";
|
||||||
|
|
||||||
function base64ToString(data) {
|
function base64ToString(data) {
|
||||||
|
var result = "";
|
||||||
var result = '';
|
|
||||||
var leftbits = 0; // number of bits decoded, but yet to be appended
|
var leftbits = 0; // number of bits decoded, but yet to be appended
|
||||||
var leftdata = 0; // bits decoded, but yet to be appended
|
var leftdata = 0; // bits decoded, but yet to be appended
|
||||||
|
|
||||||
// Convert one by one.
|
// Convert one by one.
|
||||||
for (var i = 0; i < data.length; i++) {
|
for (var i = 0; i < data.length; i++) {
|
||||||
var c = toBinaryTable[data.charCodeAt(i) & 0x7f];
|
var c = toBinaryTable[data.charCodeAt(i) & 0x7f];
|
||||||
var padding = (data[i] == base64Pad);
|
var padding = data[i] == base64Pad;
|
||||||
// Skip illegal characters and whitespace
|
// Skip illegal characters and whitespace
|
||||||
if (c == -1) continue;
|
if (c == -1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Collect data into leftdata, update bitcount
|
// Collect data into leftdata, update bitcount
|
||||||
leftdata = (leftdata << 6) | c;
|
leftdata = (leftdata << 6) | c;
|
||||||
@@ -112,15 +125,17 @@ function base64ToString(data) {
|
|||||||
if (leftbits >= 8) {
|
if (leftbits >= 8) {
|
||||||
leftbits -= 8;
|
leftbits -= 8;
|
||||||
// Append if not padding.
|
// Append if not padding.
|
||||||
if (!padding)
|
if (!padding) {
|
||||||
result += String.fromCharCode((leftdata >> leftbits) & 0xff);
|
result += String.fromCharCode((leftdata >> leftbits) & 0xff);
|
||||||
|
}
|
||||||
leftdata &= (1 << leftbits) - 1;
|
leftdata &= (1 << leftbits) - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If there are any bits left, the base64 string was corrupted
|
// If there are any bits left, the base64 string was corrupted
|
||||||
if (leftbits)
|
if (leftbits) {
|
||||||
throw Components.Exception('Corrupted base64 string');
|
throw Components.Exception("Corrupted base64 string");
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ function handleRequest(request, response) {
|
|||||||
response.setHeader("Content-Type", "text/plain; charset=UTF-8", false);
|
response.setHeader("Content-Type", "text/plain; charset=UTF-8", false);
|
||||||
|
|
||||||
if (request.hasHeader("pragma") && request.hasHeader("cache-control")) {
|
if (request.hasHeader("pragma") && request.hasHeader("cache-control")) {
|
||||||
response.write(`${request.getHeader("pragma")}:${request.getHeader("cache-control")}`);
|
response.write(
|
||||||
|
`${request.getHeader("pragma")}:${request.getHeader("cache-control")}`
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -11,7 +11,11 @@ const URL = "file_slowed_document.sjs";
|
|||||||
|
|
||||||
const DELAY = 2 * 1000; // Delay two seconds before completing the request.
|
const DELAY = 2 * 1000; // Delay two seconds before completing the request.
|
||||||
|
|
||||||
let nsTimer = Components.Constructor("@mozilla.org/timer;1", "nsITimer", "initWithCallback");
|
let nsTimer = Components.Constructor(
|
||||||
|
"@mozilla.org/timer;1",
|
||||||
|
"nsITimer",
|
||||||
|
"initWithCallback"
|
||||||
|
);
|
||||||
|
|
||||||
let timer;
|
let timer;
|
||||||
|
|
||||||
@@ -31,11 +35,15 @@ function handleRequest(request, response) {
|
|||||||
|
|
||||||
// Note: We need to store a reference to the timer to prevent it from being
|
// Note: We need to store a reference to the timer to prevent it from being
|
||||||
// canceled when it's GCed.
|
// canceled when it's GCed.
|
||||||
timer = new nsTimer(() => {
|
timer = new nsTimer(
|
||||||
|
() => {
|
||||||
if (request.queryString.includes("with-iframe")) {
|
if (request.queryString.includes("with-iframe")) {
|
||||||
response.write(`<iframe src="${URL}?r=${Math.random()}"></iframe>`);
|
response.write(`<iframe src="${URL}?r=${Math.random()}"></iframe>`);
|
||||||
}
|
}
|
||||||
response.write(`</body></html>`);
|
response.write(`</body></html>`);
|
||||||
response.finish();
|
response.finish();
|
||||||
}, DELAY, Ci.nsITimer.TYPE_ONE_SHOT);
|
},
|
||||||
|
DELAY,
|
||||||
|
Ci.nsITimer.TYPE_ONE_SHOT
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ const LINK_PATH = `${URI_PATH}file_saveAs.sjs`;
|
|||||||
const VIDEO_PATH = `${URI_PATH}file_thirdPartyChild.video.ogv`;
|
const VIDEO_PATH = `${URI_PATH}file_thirdPartyChild.video.ogv`;
|
||||||
// Reusing existing png file for testing.
|
// Reusing existing png file for testing.
|
||||||
const IMAGE_PATH = `${URI_PATH}file_favicon.png`;
|
const IMAGE_PATH = `${URI_PATH}file_favicon.png`;
|
||||||
const FRAME_PATH = `${SECOND_ORIGIN}${URI_PATH}file_saveAs.sjs?image=1`
|
const FRAME_PATH = `${SECOND_ORIGIN}${URI_PATH}file_saveAs.sjs?image=1`;
|
||||||
|
|
||||||
Components.utils.importGlobalProperties(["URLSearchParams"]);
|
Components.utils.importGlobalProperties(["URLSearchParams"]);
|
||||||
|
|
||||||
|
|||||||
@@ -11,10 +11,11 @@ function handleRequest(request, response) {
|
|||||||
|
|
||||||
var cookie = "name=value";
|
var cookie = "name=value";
|
||||||
var title = "No Cookie";
|
var title = "No Cookie";
|
||||||
if (request.hasHeader("Cookie") && request.getHeader("Cookie") == cookie)
|
if (request.hasHeader("Cookie") && request.getHeader("Cookie") == cookie) {
|
||||||
title = "Cookie";
|
title = "Cookie";
|
||||||
else
|
} else {
|
||||||
response.setHeader("Set-Cookie", cookie, false);
|
response.setHeader("Set-Cookie", cookie, false);
|
||||||
|
}
|
||||||
|
|
||||||
response.write("<html><head><title>");
|
response.write("<html><head><title>");
|
||||||
response.write(title);
|
response.write(title);
|
||||||
|
|||||||
@@ -55,8 +55,7 @@ const WORKER = `
|
|||||||
};
|
};
|
||||||
`;
|
`;
|
||||||
|
|
||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
Components.utils.importGlobalProperties(["URLSearchParams"]);
|
Components.utils.importGlobalProperties(["URLSearchParams"]);
|
||||||
let query = new URLSearchParams(request.queryString);
|
let query = new URLSearchParams(request.queryString);
|
||||||
|
|
||||||
|
|||||||
@@ -11,8 +11,12 @@ function handleRequest(req, resp) {
|
|||||||
resp.setHeader("Content-Type", "text/html;charset=utf-8", false);
|
resp.setHeader("Content-Type", "text/html;charset=utf-8", false);
|
||||||
|
|
||||||
timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
|
timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
|
||||||
timer.init(() => {
|
timer.init(
|
||||||
|
() => {
|
||||||
resp.write("hi");
|
resp.write("hi");
|
||||||
resp.finish();
|
resp.finish();
|
||||||
}, DELAY_MS, Ci.nsITimer.TYPE_ONE_SHOT);
|
},
|
||||||
|
DELAY_MS,
|
||||||
|
Ci.nsITimer.TYPE_ONE_SHOT
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,8 +11,12 @@ function handleRequest(req, resp) {
|
|||||||
resp.setHeader("Content-Type", "text/html;charset=utf-8", false);
|
resp.setHeader("Content-Type", "text/html;charset=utf-8", false);
|
||||||
|
|
||||||
timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
|
timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
|
||||||
timer.init(() => {
|
timer.init(
|
||||||
|
() => {
|
||||||
resp.write("hi");
|
resp.write("hi");
|
||||||
resp.finish();
|
resp.finish();
|
||||||
}, DELAY_MS, Ci.nsITimer.TYPE_ONE_SHOT);
|
},
|
||||||
|
DELAY_MS,
|
||||||
|
Ci.nsITimer.TYPE_ONE_SHOT
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
Components.utils.importGlobalProperties(["URLSearchParams"]);
|
Components.utils.importGlobalProperties(["URLSearchParams"]);
|
||||||
Components.utils.import("resource://gre/modules/NetUtil.jsm");
|
let { NetUtil } = ChromeUtils.import("resource://gre/modules/NetUtil.jsm");
|
||||||
let query = new URLSearchParams(request.queryString);
|
let query = new URLSearchParams(request.queryString);
|
||||||
|
|
||||||
response.setHeader("Cross-Origin-Opener-Policy", "same-origin", false);
|
response.setHeader("Cross-Origin-Opener-Policy", "same-origin", false);
|
||||||
@@ -15,8 +15,9 @@ function handleRequest(request, response) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Set up the file streams to read in the file as UTF-8
|
// Set up the file streams to read in the file as UTF-8
|
||||||
let fstream = Components.classes["@mozilla.org/network/file-input-stream;1"].
|
let fstream = Components.classes[
|
||||||
createInstance(Components.interfaces.nsIFileInputStream);
|
"@mozilla.org/network/file-input-stream;1"
|
||||||
|
].createInstance(Components.interfaces.nsIFileInputStream);
|
||||||
|
|
||||||
fstream.init(file, -1, 0, 0);
|
fstream.init(file, -1, 0, 0);
|
||||||
|
|
||||||
|
|||||||
@@ -5,9 +5,11 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
const CC = Components.Constructor;
|
const CC = Components.Constructor;
|
||||||
const BinaryInputStream = CC("@mozilla.org/binaryinputstream;1",
|
const BinaryInputStream = CC(
|
||||||
|
"@mozilla.org/binaryinputstream;1",
|
||||||
"nsIBinaryInputStream",
|
"nsIBinaryInputStream",
|
||||||
"setInputStream");
|
"setInputStream"
|
||||||
|
);
|
||||||
Cu.importGlobalProperties(["DOMParser"]);
|
Cu.importGlobalProperties(["DOMParser"]);
|
||||||
|
|
||||||
function handleRequest(req, res) {
|
function handleRequest(req, res) {
|
||||||
@@ -33,7 +35,7 @@ const statusCodes = {
|
|||||||
405: "Method Not Allowed",
|
405: "Method Not Allowed",
|
||||||
500: "Internal Server Error",
|
500: "Internal Server Error",
|
||||||
501: "Not Implemented",
|
501: "Not Implemented",
|
||||||
503: "Service Unavailable"
|
503: "Service Unavailable",
|
||||||
};
|
};
|
||||||
|
|
||||||
function HTTPError(code = 500, message) {
|
function HTTPError(code = 500, message) {
|
||||||
@@ -46,8 +48,10 @@ HTTPError.prototype.constructor = HTTPError;
|
|||||||
|
|
||||||
function sendError(res, err) {
|
function sendError(res, err) {
|
||||||
if (!(err instanceof HTTPError)) {
|
if (!(err instanceof HTTPError)) {
|
||||||
err = new HTTPError(typeof err == "number" ? err : 500,
|
err = new HTTPError(
|
||||||
err.message || typeof err == "string" ? err : "");
|
typeof err == "number" ? err : 500,
|
||||||
|
err.message || typeof err == "string" ? err : ""
|
||||||
|
);
|
||||||
}
|
}
|
||||||
res.setStatusLine("1.1", err.code, err.name);
|
res.setStatusLine("1.1", err.code, err.name);
|
||||||
res.write(err.message);
|
res.write(err.message);
|
||||||
@@ -57,8 +61,9 @@ function parseQuery(query) {
|
|||||||
let ret = {};
|
let ret = {};
|
||||||
for (let param of query.replace(/^[?&]/, "").split("&")) {
|
for (let param of query.replace(/^[?&]/, "").split("&")) {
|
||||||
param = param.split("=");
|
param = param.split("=");
|
||||||
if (!param[0])
|
if (!param[0]) {
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
ret[unescape(param[0])] = unescape(param[1]);
|
ret[unescape(param[0])] = unescape(param[1]);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
@@ -69,22 +74,23 @@ function getRequestBody(req) {
|
|||||||
let bytes = [];
|
let bytes = [];
|
||||||
let body = new BinaryInputStream(req.bodyInputStream);
|
let body = new BinaryInputStream(req.bodyInputStream);
|
||||||
|
|
||||||
while ((avail = body.available()) > 0)
|
while ((avail = body.available()) > 0) {
|
||||||
Array.prototype.push.apply(bytes, body.readByteArray(avail));
|
Array.prototype.push.apply(bytes, body.readByteArray(avail));
|
||||||
|
}
|
||||||
|
|
||||||
return String.fromCharCode.apply(null, bytes);
|
return String.fromCharCode.apply(null, bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
function sha1(str) {
|
function sha1(str) {
|
||||||
let converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"]
|
let converter = Cc[
|
||||||
.createInstance(Ci.nsIScriptableUnicodeConverter);
|
"@mozilla.org/intl/scriptableunicodeconverter"
|
||||||
|
].createInstance(Ci.nsIScriptableUnicodeConverter);
|
||||||
converter.charset = "UTF-8";
|
converter.charset = "UTF-8";
|
||||||
// `result` is an out parameter, `result.value` will contain the array length.
|
// `result` is an out parameter, `result.value` will contain the array length.
|
||||||
let result = {};
|
let result = {};
|
||||||
// `data` is an array of bytes.
|
// `data` is an array of bytes.
|
||||||
let data = converter.convertToByteArray(str, result);
|
let data = converter.convertToByteArray(str, result);
|
||||||
let ch = Cc["@mozilla.org/security/hash;1"]
|
let ch = Cc["@mozilla.org/security/hash;1"].createInstance(Ci.nsICryptoHash);
|
||||||
.createInstance(Ci.nsICryptoHash);
|
|
||||||
ch.init(ch.SHA1);
|
ch.init(ch.SHA1);
|
||||||
ch.update(data, data.length);
|
ch.update(data, data.length);
|
||||||
let hash = ch.finish(false);
|
let hash = ch.finish(false);
|
||||||
@@ -101,8 +107,9 @@ function sha1(str) {
|
|||||||
function parseXml(body) {
|
function parseXml(body) {
|
||||||
let parser = new DOMParser();
|
let parser = new DOMParser();
|
||||||
let xml = parser.parseFromString(body, "text/xml");
|
let xml = parser.parseFromString(body, "text/xml");
|
||||||
if (xml.documentElement.localName == "parsererror")
|
if (xml.documentElement.localName == "parsererror") {
|
||||||
throw new Error("Invalid XML");
|
throw new Error("Invalid XML");
|
||||||
|
}
|
||||||
return xml;
|
return xml;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,10 +117,12 @@ function getInputStream(path) {
|
|||||||
let file = Cc["@mozilla.org/file/directory_service;1"]
|
let file = Cc["@mozilla.org/file/directory_service;1"]
|
||||||
.getService(Ci.nsIProperties)
|
.getService(Ci.nsIProperties)
|
||||||
.get("CurWorkD", Ci.nsIFile);
|
.get("CurWorkD", Ci.nsIFile);
|
||||||
for (let part of path.split("/"))
|
for (let part of path.split("/")) {
|
||||||
file.append(part);
|
file.append(part);
|
||||||
let fileStream = Cc["@mozilla.org/network/file-input-stream;1"]
|
}
|
||||||
.createInstance(Ci.nsIFileInputStream);
|
let fileStream = Cc[
|
||||||
|
"@mozilla.org/network/file-input-stream;1"
|
||||||
|
].createInstance(Ci.nsIFileInputStream);
|
||||||
fileStream.init(file, 1, 0, false);
|
fileStream.init(file, 1, 0, false);
|
||||||
return fileStream;
|
return fileStream;
|
||||||
}
|
}
|
||||||
@@ -122,25 +131,33 @@ function checkAuth(req) {
|
|||||||
let err = new Error("Authorization failed");
|
let err = new Error("Authorization failed");
|
||||||
err.code = 401;
|
err.code = 401;
|
||||||
|
|
||||||
if (!req.hasHeader("Authorization"))
|
if (!req.hasHeader("Authorization")) {
|
||||||
throw new HTTPError(401, "No Authorization header provided.");
|
throw new HTTPError(401, "No Authorization header provided.");
|
||||||
|
}
|
||||||
|
|
||||||
let auth = req.getHeader("Authorization");
|
let auth = req.getHeader("Authorization");
|
||||||
if (!auth.startsWith("Bearer "))
|
if (!auth.startsWith("Bearer ")) {
|
||||||
throw new HTTPError(401, "Invalid Authorization header content: '" + auth + "'");
|
throw new HTTPError(
|
||||||
|
401,
|
||||||
|
"Invalid Authorization header content: '" + auth + "'"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// Rejecting inactive subscriptions.
|
// Rejecting inactive subscriptions.
|
||||||
if (auth.includes("inactive")) {
|
if (auth.includes("inactive")) {
|
||||||
const INACTIVE_STATE_RESPONSE = "<html><body><h1>TranslateApiException</h1><p>Method: TranslateArray()</p><p>Message: The Azure Market Place Translator Subscription associated with the request credentials is not in an active state.</p><code></code><p>message id=5641.V2_Rest.TranslateArray.48CC6470</p></body></html>";
|
const INACTIVE_STATE_RESPONSE =
|
||||||
|
"<html><body><h1>TranslateApiException</h1><p>Method: TranslateArray()</p><p>Message: The Azure Market Place Translator Subscription associated with the request credentials is not in an active state.</p><code></code><p>message id=5641.V2_Rest.TranslateArray.48CC6470</p></body></html>";
|
||||||
throw new HTTPError(401, INACTIVE_STATE_RESPONSE);
|
throw new HTTPError(401, INACTIVE_STATE_RESPONSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function reallyHandleRequest(req, res) {
|
function reallyHandleRequest(req, res) {
|
||||||
log("method: " + req.method);
|
log("method: " + req.method);
|
||||||
if (req.method != "POST") {
|
if (req.method != "POST") {
|
||||||
sendError(res, "Bing only deals with POST requests, not '" + req.method + "'.");
|
sendError(
|
||||||
|
res,
|
||||||
|
"Bing only deals with POST requests, not '" + req.method + "'."
|
||||||
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -148,7 +165,9 @@ function reallyHandleRequest(req, res) {
|
|||||||
log("body: " + body);
|
log("body: " + body);
|
||||||
|
|
||||||
// First, we'll see if we're dealing with an XML body:
|
// First, we'll see if we're dealing with an XML body:
|
||||||
let contentType = req.hasHeader("Content-Type") ? req.getHeader("Content-Type") : null;
|
let contentType = req.hasHeader("Content-Type")
|
||||||
|
? req.getHeader("Content-Type")
|
||||||
|
: null;
|
||||||
log("contentType: " + contentType);
|
log("contentType: " + contentType);
|
||||||
|
|
||||||
if (contentType.startsWith("text/xml")) {
|
if (contentType.startsWith("text/xml")) {
|
||||||
@@ -161,10 +180,11 @@ function reallyHandleRequest(req, res) {
|
|||||||
let method = xml.documentElement.localName;
|
let method = xml.documentElement.localName;
|
||||||
log("invoking method: " + method);
|
log("invoking method: " + method);
|
||||||
// If the requested method is supported, delegate it to its handler.
|
// If the requested method is supported, delegate it to its handler.
|
||||||
if (methodHandlers[method])
|
if (methodHandlers[method]) {
|
||||||
methodHandlers[method](res, xml);
|
methodHandlers[method](res, xml);
|
||||||
else
|
} else {
|
||||||
throw new HTTPError(501);
|
throw new HTTPError(501);
|
||||||
|
}
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
sendError(res, ex, ex.code);
|
sendError(res, ex, ex.code);
|
||||||
}
|
}
|
||||||
@@ -173,15 +193,16 @@ function reallyHandleRequest(req, res) {
|
|||||||
let params = parseQuery(body);
|
let params = parseQuery(body);
|
||||||
|
|
||||||
// Delegate an authentication request to the correct handler.
|
// Delegate an authentication request to the correct handler.
|
||||||
if ("grant_type" in params && params.grant_type == "client_credentials")
|
if ("grant_type" in params && params.grant_type == "client_credentials") {
|
||||||
methodHandlers.authenticate(res, params);
|
methodHandlers.authenticate(res, params);
|
||||||
else
|
} else {
|
||||||
sendError(res, 501);
|
sendError(res, 501);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const methodHandlers = {
|
const methodHandlers = {
|
||||||
authenticate: function(res, params) {
|
authenticate(res, params) {
|
||||||
// Validate a few required parameters.
|
// Validate a few required parameters.
|
||||||
if (params.scope != "http://api.microsofttranslator.com") {
|
if (params.scope != "http://api.microsofttranslator.com") {
|
||||||
sendError(res, "Invalid scope.");
|
sendError(res, "Invalid scope.");
|
||||||
@@ -198,16 +219,16 @@ const methodHandlers = {
|
|||||||
|
|
||||||
// Defines the tokens for certain client ids.
|
// Defines the tokens for certain client ids.
|
||||||
const TOKEN_MAP = {
|
const TOKEN_MAP = {
|
||||||
'testInactive' : 'inactive',
|
testInactive: "inactive",
|
||||||
'testClient' : 'test'
|
testClient: "test",
|
||||||
};
|
};
|
||||||
let token = 'test'; // Default token.
|
let token = "test"; // Default token.
|
||||||
if((params.client_id in TOKEN_MAP)){
|
if (params.client_id in TOKEN_MAP) {
|
||||||
token = TOKEN_MAP[params.client_id];
|
token = TOKEN_MAP[params.client_id];
|
||||||
}
|
}
|
||||||
let content = JSON.stringify({
|
let content = JSON.stringify({
|
||||||
access_token: token,
|
access_token: token,
|
||||||
expires_in: 600
|
expires_in: 600,
|
||||||
});
|
});
|
||||||
|
|
||||||
res.setStatusLine("1.1", 200, "OK");
|
res.setStatusLine("1.1", 200, "OK");
|
||||||
@@ -216,9 +237,9 @@ const methodHandlers = {
|
|||||||
res.write(content);
|
res.write(content);
|
||||||
},
|
},
|
||||||
|
|
||||||
TranslateArrayRequest: function(res, xml, body) {
|
TranslateArrayRequest(res, xml, body) {
|
||||||
let from = xml.querySelector("From").firstChild.nodeValue;
|
let from = xml.querySelector("From").firstChild.nodeValue;
|
||||||
let to = xml.querySelector("To").firstChild.nodeValue
|
let to = xml.querySelector("To").firstChild.nodeValue;
|
||||||
log("translating from '" + from + "' to '" + to + "'");
|
log("translating from '" + from + "' to '" + to + "'");
|
||||||
|
|
||||||
res.setStatusLine("1.1", 200, "OK");
|
res.setStatusLine("1.1", 200, "OK");
|
||||||
@@ -227,8 +248,11 @@ const methodHandlers = {
|
|||||||
let hash = sha1(body).substr(0, 10);
|
let hash = sha1(body).substr(0, 10);
|
||||||
log("SHA1 hash of content: " + hash);
|
log("SHA1 hash of content: " + hash);
|
||||||
let inputStream = getInputStream(
|
let inputStream = getInputStream(
|
||||||
"browser/browser/components/translation/test/fixtures/result-" + hash + ".txt");
|
"browser/browser/components/translation/test/fixtures/result-" +
|
||||||
|
hash +
|
||||||
|
".txt"
|
||||||
|
);
|
||||||
res.bodyOutputStream.writeFrom(inputStream, inputStream.available());
|
res.bodyOutputStream.writeFrom(inputStream, inputStream.available());
|
||||||
inputStream.close();
|
inputStream.close();
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -5,9 +5,11 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
const CC = Components.Constructor;
|
const CC = Components.Constructor;
|
||||||
const BinaryInputStream = CC("@mozilla.org/binaryinputstream;1",
|
const BinaryInputStream = CC(
|
||||||
|
"@mozilla.org/binaryinputstream;1",
|
||||||
"nsIBinaryInputStream",
|
"nsIBinaryInputStream",
|
||||||
"setInputStream");
|
"setInputStream"
|
||||||
|
);
|
||||||
|
|
||||||
function handleRequest(req, res) {
|
function handleRequest(req, res) {
|
||||||
try {
|
try {
|
||||||
@@ -34,7 +36,7 @@ const statusCodes = {
|
|||||||
422: "The text could not be translated",
|
422: "The text could not be translated",
|
||||||
500: "Internal Server Error",
|
500: "Internal Server Error",
|
||||||
501: "The specified translation direction is not supported",
|
501: "The specified translation direction is not supported",
|
||||||
503: "Service Unavailable"
|
503: "Service Unavailable",
|
||||||
};
|
};
|
||||||
|
|
||||||
function HTTPError(code = 500, message) {
|
function HTTPError(code = 500, message) {
|
||||||
@@ -47,8 +49,10 @@ HTTPError.prototype.constructor = HTTPError;
|
|||||||
|
|
||||||
function sendError(res, err) {
|
function sendError(res, err) {
|
||||||
if (!(err instanceof HTTPError)) {
|
if (!(err instanceof HTTPError)) {
|
||||||
err = new HTTPError(typeof err == "number" ? err : 500,
|
err = new HTTPError(
|
||||||
err.message || typeof err == "string" ? err : "");
|
typeof err == "number" ? err : 500,
|
||||||
|
err.message || typeof err == "string" ? err : ""
|
||||||
|
);
|
||||||
}
|
}
|
||||||
res.setStatusLine("1.1", err.code, err.name);
|
res.setStatusLine("1.1", err.code, err.name);
|
||||||
res.write(err.message);
|
res.write(err.message);
|
||||||
@@ -61,16 +65,19 @@ function parseQuery(query) {
|
|||||||
params = {},
|
params = {},
|
||||||
pl = /\+/g,
|
pl = /\+/g,
|
||||||
search = /([^&=]+)=?([^&]*)/g,
|
search = /([^&=]+)=?([^&]*)/g,
|
||||||
decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); };
|
decode = function(s) {
|
||||||
|
return decodeURIComponent(s.replace(pl, " "));
|
||||||
|
};
|
||||||
|
|
||||||
while (match = search.exec(query)) {
|
while ((match = search.exec(query))) {
|
||||||
let k = decode(match[1]),
|
let k = decode(match[1]),
|
||||||
v = decode(match[2]);
|
v = decode(match[2]);
|
||||||
if (k in params) {
|
if (k in params) {
|
||||||
if(params[k] instanceof Array)
|
if (params[k] instanceof Array) {
|
||||||
params[k].push(v);
|
params[k].push(v);
|
||||||
else
|
} else {
|
||||||
params[k] = [params[k], v];
|
params[k] = [params[k], v];
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
params[k] = v;
|
params[k] = v;
|
||||||
}
|
}
|
||||||
@@ -80,15 +87,15 @@ function parseQuery(query) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function sha1(str) {
|
function sha1(str) {
|
||||||
let converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"]
|
let converter = Cc[
|
||||||
.createInstance(Ci.nsIScriptableUnicodeConverter);
|
"@mozilla.org/intl/scriptableunicodeconverter"
|
||||||
|
].createInstance(Ci.nsIScriptableUnicodeConverter);
|
||||||
converter.charset = "UTF-8";
|
converter.charset = "UTF-8";
|
||||||
// `result` is an out parameter, `result.value` will contain the array length.
|
// `result` is an out parameter, `result.value` will contain the array length.
|
||||||
let result = {};
|
let result = {};
|
||||||
// `data` is an array of bytes.
|
// `data` is an array of bytes.
|
||||||
let data = converter.convertToByteArray(str, result);
|
let data = converter.convertToByteArray(str, result);
|
||||||
let ch = Cc["@mozilla.org/security/hash;1"]
|
let ch = Cc["@mozilla.org/security/hash;1"].createInstance(Ci.nsICryptoHash);
|
||||||
.createInstance(Ci.nsICryptoHash);
|
|
||||||
ch.init(ch.SHA1);
|
ch.init(ch.SHA1);
|
||||||
ch.update(data, data.length);
|
ch.update(data, data.length);
|
||||||
let hash = ch.finish(false);
|
let hash = ch.finish(false);
|
||||||
@@ -107,8 +114,9 @@ function getRequestBody(req) {
|
|||||||
let bytes = [];
|
let bytes = [];
|
||||||
let body = new BinaryInputStream(req.bodyInputStream);
|
let body = new BinaryInputStream(req.bodyInputStream);
|
||||||
|
|
||||||
while ((avail = body.available()) > 0)
|
while ((avail = body.available()) > 0) {
|
||||||
Array.prototype.push.apply(bytes, body.readByteArray(avail));
|
Array.prototype.push.apply(bytes, body.readByteArray(avail));
|
||||||
|
}
|
||||||
|
|
||||||
return String.fromCharCode.apply(null, bytes);
|
return String.fromCharCode.apply(null, bytes);
|
||||||
}
|
}
|
||||||
@@ -117,10 +125,12 @@ function getInputStream(path) {
|
|||||||
let file = Cc["@mozilla.org/file/directory_service;1"]
|
let file = Cc["@mozilla.org/file/directory_service;1"]
|
||||||
.getService(Ci.nsIProperties)
|
.getService(Ci.nsIProperties)
|
||||||
.get("CurWorkD", Ci.nsIFile);
|
.get("CurWorkD", Ci.nsIFile);
|
||||||
for (let part of path.split("/"))
|
for (let part of path.split("/")) {
|
||||||
file.append(part);
|
file.append(part);
|
||||||
let fileStream = Cc["@mozilla.org/network/file-input-stream;1"]
|
}
|
||||||
.createInstance(Ci.nsIFileInputStream);
|
let fileStream = Cc[
|
||||||
|
"@mozilla.org/network/file-input-stream;1"
|
||||||
|
].createInstance(Ci.nsIFileInputStream);
|
||||||
fileStream.init(file, 1, 0, false);
|
fileStream.init(file, 1, 0, false);
|
||||||
return fileStream;
|
return fileStream;
|
||||||
}
|
}
|
||||||
@@ -138,33 +148,34 @@ function getInputStream(path) {
|
|||||||
* If any other key is used the server reponds with 401 error code.
|
* If any other key is used the server reponds with 401 error code.
|
||||||
*/
|
*/
|
||||||
function checkAuth(params) {
|
function checkAuth(params) {
|
||||||
if(!("key" in params))
|
if (!("key" in params)) {
|
||||||
throw new HTTPError(400);
|
throw new HTTPError(400);
|
||||||
|
}
|
||||||
|
|
||||||
let key = params.key;
|
let key = params.key;
|
||||||
if(key === "yandexValidKey")
|
if (key === "yandexValidKey") {
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
let invalidKeys = {
|
let invalidKeys = {
|
||||||
"yandexInvalidKey" : 401,
|
yandexInvalidKey: 401,
|
||||||
"yandexBlockedKey" : 402,
|
yandexBlockedKey: 402,
|
||||||
"yandexOutOfRequestsKey" : 403,
|
yandexOutOfRequestsKey: 403,
|
||||||
"yandexOutOfCharsKey" : 404,
|
yandexOutOfCharsKey: 404,
|
||||||
};
|
};
|
||||||
|
|
||||||
if(key in invalidKeys)
|
if (key in invalidKeys) {
|
||||||
throw new HTTPError(invalidKeys[key]);
|
throw new HTTPError(invalidKeys[key]);
|
||||||
|
}
|
||||||
|
|
||||||
throw new HTTPError(401);
|
throw new HTTPError(401);
|
||||||
}
|
}
|
||||||
|
|
||||||
function reallyHandleRequest(req, res) {
|
function reallyHandleRequest(req, res) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
// Preparing the query parameters.
|
// Preparing the query parameters.
|
||||||
let params = {};
|
let params = {};
|
||||||
if(req.method == 'POST') {
|
if (req.method == "POST") {
|
||||||
params = parseQuery(getRequestBody(req));
|
params = parseQuery(getRequestBody(req));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -172,28 +183,28 @@ function reallyHandleRequest(req, res) {
|
|||||||
log(JSON.stringify(params));
|
log(JSON.stringify(params));
|
||||||
|
|
||||||
checkAuth(params);
|
checkAuth(params);
|
||||||
methodHandlers['translate'](res, params);
|
methodHandlers.translate(res, params);
|
||||||
|
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
sendError(res, ex, ex.code);
|
sendError(res, ex, ex.code);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const methodHandlers = {
|
const methodHandlers = {
|
||||||
translate: function(res, params) {
|
translate(res, params) {
|
||||||
res.setStatusLine("1.1", 200, "OK");
|
res.setStatusLine("1.1", 200, "OK");
|
||||||
res.setHeader("Content-Type", "application/json");
|
res.setHeader("Content-Type", "application/json");
|
||||||
|
|
||||||
let hash = sha1(JSON.stringify(params)).substr(0, 10);
|
let hash = sha1(JSON.stringify(params)).substr(0, 10);
|
||||||
log("SHA1 hash of content: " + hash);
|
log("SHA1 hash of content: " + hash);
|
||||||
|
|
||||||
let fixture = "browser/browser/components/translation/test/fixtures/result-yandex-" + hash + ".json";
|
let fixture =
|
||||||
|
"browser/browser/components/translation/test/fixtures/result-yandex-" +
|
||||||
|
hash +
|
||||||
|
".json";
|
||||||
log("PATH: " + fixture);
|
log("PATH: " + fixture);
|
||||||
|
|
||||||
let inputStream = getInputStream(fixture);
|
let inputStream = getInputStream(fixture);
|
||||||
res.bodyOutputStream.writeFrom(inputStream, inputStream.available());
|
res.bodyOutputStream.writeFrom(inputStream, inputStream.available());
|
||||||
inputStream.close();
|
inputStream.close();
|
||||||
}
|
},
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
try {
|
try {
|
||||||
reallyHandleRequest(request, response);
|
reallyHandleRequest(request, response);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -8,10 +7,10 @@ function handleRequest(request, response)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function reallyHandleRequest(request, response) {
|
function reallyHandleRequest(request, response) {
|
||||||
var match;
|
var match;
|
||||||
var requestAuth = true, requestProxyAuth = true;
|
var requestAuth = true,
|
||||||
|
requestProxyAuth = true;
|
||||||
|
|
||||||
// Allow the caller to drive how authentication is processed via the query.
|
// Allow the caller to drive how authentication is processed via the query.
|
||||||
// Eg, http://localhost:8888/authenticate.sjs?user=foo&realm=bar
|
// Eg, http://localhost:8888/authenticate.sjs?user=foo&realm=bar
|
||||||
@@ -19,59 +18,75 @@ function reallyHandleRequest(request, response) {
|
|||||||
// at the beginning of the query string.
|
// at the beginning of the query string.
|
||||||
var query = "?" + request.queryString;
|
var query = "?" + request.queryString;
|
||||||
|
|
||||||
var expected_user = "", expected_pass = "", realm = "mochitest";
|
var expected_user = "",
|
||||||
var proxy_expected_user = "", proxy_expected_pass = "", proxy_realm = "mochi-proxy";
|
expected_pass = "",
|
||||||
var huge = false, plugin = false, anonymous = false;
|
realm = "mochitest";
|
||||||
|
var proxy_expected_user = "",
|
||||||
|
proxy_expected_pass = "",
|
||||||
|
proxy_realm = "mochi-proxy";
|
||||||
|
var huge = false,
|
||||||
|
plugin = false,
|
||||||
|
anonymous = false;
|
||||||
var authHeaderCount = 1;
|
var authHeaderCount = 1;
|
||||||
// user=xxx
|
// user=xxx
|
||||||
match = /[^_]user=([^&]*)/.exec(query);
|
match = /[^_]user=([^&]*)/.exec(query);
|
||||||
if (match)
|
if (match) {
|
||||||
expected_user = match[1];
|
expected_user = match[1];
|
||||||
|
}
|
||||||
|
|
||||||
// pass=xxx
|
// pass=xxx
|
||||||
match = /[^_]pass=([^&]*)/.exec(query);
|
match = /[^_]pass=([^&]*)/.exec(query);
|
||||||
if (match)
|
if (match) {
|
||||||
expected_pass = match[1];
|
expected_pass = match[1];
|
||||||
|
}
|
||||||
|
|
||||||
// realm=xxx
|
// realm=xxx
|
||||||
match = /[^_]realm=([^&]*)/.exec(query);
|
match = /[^_]realm=([^&]*)/.exec(query);
|
||||||
if (match)
|
if (match) {
|
||||||
realm = match[1];
|
realm = match[1];
|
||||||
|
}
|
||||||
|
|
||||||
// proxy_user=xxx
|
// proxy_user=xxx
|
||||||
match = /proxy_user=([^&]*)/.exec(query);
|
match = /proxy_user=([^&]*)/.exec(query);
|
||||||
if (match)
|
if (match) {
|
||||||
proxy_expected_user = match[1];
|
proxy_expected_user = match[1];
|
||||||
|
}
|
||||||
|
|
||||||
// proxy_pass=xxx
|
// proxy_pass=xxx
|
||||||
match = /proxy_pass=([^&]*)/.exec(query);
|
match = /proxy_pass=([^&]*)/.exec(query);
|
||||||
if (match)
|
if (match) {
|
||||||
proxy_expected_pass = match[1];
|
proxy_expected_pass = match[1];
|
||||||
|
}
|
||||||
|
|
||||||
// proxy_realm=xxx
|
// proxy_realm=xxx
|
||||||
match = /proxy_realm=([^&]*)/.exec(query);
|
match = /proxy_realm=([^&]*)/.exec(query);
|
||||||
if (match)
|
if (match) {
|
||||||
proxy_realm = match[1];
|
proxy_realm = match[1];
|
||||||
|
}
|
||||||
|
|
||||||
// huge=1
|
// huge=1
|
||||||
match = /huge=1/.exec(query);
|
match = /huge=1/.exec(query);
|
||||||
if (match)
|
if (match) {
|
||||||
huge = true;
|
huge = true;
|
||||||
|
}
|
||||||
|
|
||||||
// plugin=1
|
// plugin=1
|
||||||
match = /plugin=1/.exec(query);
|
match = /plugin=1/.exec(query);
|
||||||
if (match)
|
if (match) {
|
||||||
plugin = true;
|
plugin = true;
|
||||||
|
}
|
||||||
|
|
||||||
// multiple=1
|
// multiple=1
|
||||||
match = /multiple=([^&]*)/.exec(query);
|
match = /multiple=([^&]*)/.exec(query);
|
||||||
if (match)
|
if (match) {
|
||||||
authHeaderCount = match[1] + 0;
|
authHeaderCount = match[1] + 0;
|
||||||
|
}
|
||||||
|
|
||||||
// anonymous=1
|
// anonymous=1
|
||||||
match = /anonymous=1/.exec(query);
|
match = /anonymous=1/.exec(query);
|
||||||
if (match)
|
if (match) {
|
||||||
anonymous = true;
|
anonymous = true;
|
||||||
|
}
|
||||||
|
|
||||||
// Look for an authentication header, if any, in the request.
|
// Look for an authentication header, if any, in the request.
|
||||||
//
|
//
|
||||||
@@ -80,72 +95,101 @@ function reallyHandleRequest(request, response) {
|
|||||||
// This test only supports Basic auth. The value sent by the client is
|
// This test only supports Basic auth. The value sent by the client is
|
||||||
// "username:password", obscured with base64 encoding.
|
// "username:password", obscured with base64 encoding.
|
||||||
|
|
||||||
var actual_user = "", actual_pass = "", authHeader, authPresent = false;
|
var actual_user = "",
|
||||||
|
actual_pass = "",
|
||||||
|
authHeader,
|
||||||
|
authPresent = false;
|
||||||
if (request.hasHeader("Authorization")) {
|
if (request.hasHeader("Authorization")) {
|
||||||
authPresent = true;
|
authPresent = true;
|
||||||
authHeader = request.getHeader("Authorization");
|
authHeader = request.getHeader("Authorization");
|
||||||
match = /Basic (.+)/.exec(authHeader);
|
match = /Basic (.+)/.exec(authHeader);
|
||||||
if (match.length != 2)
|
if (match.length != 2) {
|
||||||
throw "Couldn't parse auth header: " + authHeader;
|
throw "Couldn't parse auth header: " + authHeader;
|
||||||
|
}
|
||||||
|
|
||||||
var userpass = base64ToString(match[1]); // no atob() :-(
|
var userpass = base64ToString(match[1]); // no atob() :-(
|
||||||
match = /(.*):(.*)/.exec(userpass);
|
match = /(.*):(.*)/.exec(userpass);
|
||||||
if (match.length != 3)
|
if (match.length != 3) {
|
||||||
throw "Couldn't decode auth header: " + userpass;
|
throw "Couldn't decode auth header: " + userpass;
|
||||||
|
}
|
||||||
actual_user = match[1];
|
actual_user = match[1];
|
||||||
actual_pass = match[2];
|
actual_pass = match[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
var proxy_actual_user = "", proxy_actual_pass = "";
|
var proxy_actual_user = "",
|
||||||
|
proxy_actual_pass = "";
|
||||||
if (request.hasHeader("Proxy-Authorization")) {
|
if (request.hasHeader("Proxy-Authorization")) {
|
||||||
authHeader = request.getHeader("Proxy-Authorization");
|
authHeader = request.getHeader("Proxy-Authorization");
|
||||||
match = /Basic (.+)/.exec(authHeader);
|
match = /Basic (.+)/.exec(authHeader);
|
||||||
if (match.length != 2)
|
if (match.length != 2) {
|
||||||
throw "Couldn't parse auth header: " + authHeader;
|
throw "Couldn't parse auth header: " + authHeader;
|
||||||
|
}
|
||||||
|
|
||||||
var userpass = base64ToString(match[1]); // no atob() :-(
|
var userpass = base64ToString(match[1]); // no atob() :-(
|
||||||
match = /(.*):(.*)/.exec(userpass);
|
match = /(.*):(.*)/.exec(userpass);
|
||||||
if (match.length != 3)
|
if (match.length != 3) {
|
||||||
throw "Couldn't decode auth header: " + userpass;
|
throw "Couldn't decode auth header: " + userpass;
|
||||||
|
}
|
||||||
proxy_actual_user = match[1];
|
proxy_actual_user = match[1];
|
||||||
proxy_actual_pass = match[2];
|
proxy_actual_pass = match[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't request authentication if the credentials we got were what we
|
// Don't request authentication if the credentials we got were what we
|
||||||
// expected.
|
// expected.
|
||||||
if (expected_user == actual_user &&
|
if (expected_user == actual_user && expected_pass == actual_pass) {
|
||||||
expected_pass == actual_pass) {
|
|
||||||
requestAuth = false;
|
requestAuth = false;
|
||||||
}
|
}
|
||||||
if (proxy_expected_user == proxy_actual_user &&
|
if (
|
||||||
proxy_expected_pass == proxy_actual_pass) {
|
proxy_expected_user == proxy_actual_user &&
|
||||||
|
proxy_expected_pass == proxy_actual_pass
|
||||||
|
) {
|
||||||
requestProxyAuth = false;
|
requestProxyAuth = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (anonymous) {
|
if (anonymous) {
|
||||||
if (authPresent) {
|
if (authPresent) {
|
||||||
response.setStatusLine("1.0", 400, "Unexpected authorization header found");
|
response.setStatusLine(
|
||||||
|
"1.0",
|
||||||
|
400,
|
||||||
|
"Unexpected authorization header found"
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
response.setStatusLine("1.0", 200, "Authorization header not found");
|
response.setStatusLine("1.0", 200, "Authorization header not found");
|
||||||
}
|
}
|
||||||
} else {
|
} else if (requestProxyAuth) {
|
||||||
if (requestProxyAuth) {
|
|
||||||
response.setStatusLine("1.0", 407, "Proxy authentication required");
|
response.setStatusLine("1.0", 407, "Proxy authentication required");
|
||||||
for (i = 0; i < authHeaderCount; ++i)
|
for (i = 0; i < authHeaderCount; ++i) {
|
||||||
response.setHeader("Proxy-Authenticate", "basic realm=\"" + proxy_realm + "\"", true);
|
response.setHeader(
|
||||||
|
"Proxy-Authenticate",
|
||||||
|
'basic realm="' + proxy_realm + '"',
|
||||||
|
true
|
||||||
|
);
|
||||||
|
}
|
||||||
} else if (requestAuth) {
|
} else if (requestAuth) {
|
||||||
response.setStatusLine("1.0", 401, "Authentication required");
|
response.setStatusLine("1.0", 401, "Authentication required");
|
||||||
for (i = 0; i < authHeaderCount; ++i)
|
for (i = 0; i < authHeaderCount; ++i) {
|
||||||
response.setHeader("WWW-Authenticate", "basic realm=\"" + realm + "\"", true);
|
response.setHeader(
|
||||||
|
"WWW-Authenticate",
|
||||||
|
'basic realm="' + realm + '"',
|
||||||
|
true
|
||||||
|
);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
response.setStatusLine("1.0", 200, "OK");
|
response.setStatusLine("1.0", 200, "OK");
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
response.setHeader("Content-Type", "application/xhtml+xml", false);
|
response.setHeader("Content-Type", "application/xhtml+xml", false);
|
||||||
response.write("<html xmlns='http://www.w3.org/1999/xhtml'>");
|
response.write("<html xmlns='http://www.w3.org/1999/xhtml'>");
|
||||||
response.write("<p>Login: <span id='ok'>" + (requestAuth ? "FAIL" : "PASS") + "</span></p>\n");
|
response.write(
|
||||||
response.write("<p>Proxy: <span id='proxy'>" + (requestProxyAuth ? "FAIL" : "PASS") + "</span></p>\n");
|
"<p>Login: <span id='ok'>" +
|
||||||
|
(requestAuth ? "FAIL" : "PASS") +
|
||||||
|
"</span></p>\n"
|
||||||
|
);
|
||||||
|
response.write(
|
||||||
|
"<p>Proxy: <span id='proxy'>" +
|
||||||
|
(requestProxyAuth ? "FAIL" : "PASS") +
|
||||||
|
"</span></p>\n"
|
||||||
|
);
|
||||||
response.write("<p>Auth: <span id='auth'>" + authHeader + "</span></p>\n");
|
response.write("<p>Auth: <span id='auth'>" + authHeader + "</span></p>\n");
|
||||||
response.write("<p>User: <span id='user'>" + actual_user + "</span></p>\n");
|
response.write("<p>User: <span id='user'>" + actual_user + "</span></p>\n");
|
||||||
response.write("<p>Pass: <span id='pass'>" + actual_pass + "</span></p>\n");
|
response.write("<p>Pass: <span id='pass'>" + actual_pass + "</span></p>\n");
|
||||||
@@ -156,23 +200,27 @@ function reallyHandleRequest(request, response) {
|
|||||||
response.write("123456789\n");
|
response.write("123456789\n");
|
||||||
}
|
}
|
||||||
response.write("</div>");
|
response.write("</div>");
|
||||||
response.write("<span id='footnote'>This is a footnote after the huge content fill</span>");
|
response.write(
|
||||||
|
"<span id='footnote'>This is a footnote after the huge content fill</span>"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (plugin) {
|
if (plugin) {
|
||||||
response.write("<embed id='embedtest' style='width: 400px; height: 100px;' " +
|
response.write(
|
||||||
"type='application/x-test'></embed>\n");
|
"<embed id='embedtest' style='width: 400px; height: 100px;' " +
|
||||||
|
"type='application/x-test'></embed>\n"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
response.write("</html>");
|
response.write("</html>");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// base64 decoder
|
// base64 decoder
|
||||||
//
|
//
|
||||||
// Yoinked from extensions/xml-rpc/src/nsXmlRpcClient.js because btoa()
|
// Yoinked from extensions/xml-rpc/src/nsXmlRpcClient.js because btoa()
|
||||||
// doesn't seem to exist. :-(
|
// doesn't seem to exist. :-(
|
||||||
/* Convert Base64 data to a string */
|
/* Convert Base64 data to a string */
|
||||||
|
/* eslint-disable prettier/prettier */
|
||||||
const toBinaryTable = [
|
const toBinaryTable = [
|
||||||
-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
|
-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
|
||||||
-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
|
-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
|
||||||
@@ -183,20 +231,22 @@ const toBinaryTable = [
|
|||||||
-1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
|
-1,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,-1, -1,-1,-1,-1
|
41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1
|
||||||
];
|
];
|
||||||
const base64Pad = '=';
|
/* eslint-enable prettier/prettier */
|
||||||
|
const base64Pad = "=";
|
||||||
|
|
||||||
function base64ToString(data) {
|
function base64ToString(data) {
|
||||||
|
var result = "";
|
||||||
var result = '';
|
|
||||||
var leftbits = 0; // number of bits decoded, but yet to be appended
|
var leftbits = 0; // number of bits decoded, but yet to be appended
|
||||||
var leftdata = 0; // bits decoded, but yet to be appended
|
var leftdata = 0; // bits decoded, but yet to be appended
|
||||||
|
|
||||||
// Convert one by one.
|
// Convert one by one.
|
||||||
for (var i = 0; i < data.length; i++) {
|
for (var i = 0; i < data.length; i++) {
|
||||||
var c = toBinaryTable[data.charCodeAt(i) & 0x7f];
|
var c = toBinaryTable[data.charCodeAt(i) & 0x7f];
|
||||||
var padding = (data[i] == base64Pad);
|
var padding = data[i] == base64Pad;
|
||||||
// Skip illegal characters and whitespace
|
// Skip illegal characters and whitespace
|
||||||
if (c == -1) continue;
|
if (c == -1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Collect data into leftdata, update bitcount
|
// Collect data into leftdata, update bitcount
|
||||||
leftdata = (leftdata << 6) | c;
|
leftdata = (leftdata << 6) | c;
|
||||||
@@ -206,15 +256,17 @@ function base64ToString(data) {
|
|||||||
if (leftbits >= 8) {
|
if (leftbits >= 8) {
|
||||||
leftbits -= 8;
|
leftbits -= 8;
|
||||||
// Append if not padding.
|
// Append if not padding.
|
||||||
if (!padding)
|
if (!padding) {
|
||||||
result += String.fromCharCode((leftdata >> leftbits) & 0xff);
|
result += String.fromCharCode((leftdata >> leftbits) & 0xff);
|
||||||
|
}
|
||||||
leftdata &= (1 << leftbits) - 1;
|
leftdata &= (1 << leftbits) - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If there are any bits left, the base64 string was corrupted
|
// If there are any bits left, the base64 string was corrupted
|
||||||
if (leftbits)
|
if (leftbits) {
|
||||||
throw Components.Exception('Corrupted base64 string');
|
throw Components.Exception("Corrupted base64 string");
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
const CC = Components.Constructor;
|
const CC = Components.Constructor;
|
||||||
const BinaryInputStream = CC("@mozilla.org/binaryinputstream;1",
|
const BinaryInputStream = CC(
|
||||||
|
"@mozilla.org/binaryinputstream;1",
|
||||||
"nsIBinaryInputStream",
|
"nsIBinaryInputStream",
|
||||||
"setInputStream");
|
"setInputStream"
|
||||||
|
);
|
||||||
|
|
||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
response.setHeader("Content-Type", "text/plain", false);
|
response.setHeader("Content-Type", "text/plain", false);
|
||||||
@@ -13,8 +15,9 @@ function handleRequest(request, response) {
|
|||||||
var avail;
|
var avail;
|
||||||
var bytes = [];
|
var bytes = [];
|
||||||
|
|
||||||
while ((avail = body.available()) > 0)
|
while ((avail = body.available()) > 0) {
|
||||||
Array.prototype.push.apply(bytes, body.readByteArray(avail));
|
Array.prototype.push.apply(bytes, body.readByteArray(avail));
|
||||||
|
}
|
||||||
|
|
||||||
var data = String.fromCharCode.apply(null, bytes);
|
var data = String.fromCharCode.apply(null, bytes);
|
||||||
response.bodyOutputStream.write(data, data.length);
|
response.bodyOutputStream.write(data, data.length);
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ function handleRequest(aRequest, aResponse) {
|
|||||||
aResponse.setStatusLine(aRequest.httpVersion, 301, "Moved Permanently");
|
aResponse.setStatusLine(aRequest.httpVersion, 301, "Moved Permanently");
|
||||||
|
|
||||||
// Set redirect URI, mirroring the hash value.
|
// Set redirect URI, mirroring the hash value.
|
||||||
let hash = (/\#.+/.test(aRequest.path))?
|
let hash = /\#.+/.test(aRequest.path)
|
||||||
"#" + aRequest.path.split("#")[1]:
|
? "#" + aRequest.path.split("#")[1]
|
||||||
"";
|
: "";
|
||||||
aResponse.setHeader("Location", REDIRECT_TO + hash);
|
aResponse.setHeader("Location", REDIRECT_TO + hash);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,15 +18,19 @@ function handleRequest(req, resp) {
|
|||||||
return memo;
|
return memo;
|
||||||
}, {});
|
}, {});
|
||||||
|
|
||||||
let timeout = parseInt(params["timeout"]);
|
let timeout = parseInt(params.timeout);
|
||||||
if (timeout) {
|
if (timeout) {
|
||||||
// Write the response after a timeout.
|
// Write the response after a timeout.
|
||||||
resp.processAsync();
|
resp.processAsync();
|
||||||
gTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
|
gTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
|
||||||
gTimer.init(() => {
|
gTimer.init(
|
||||||
|
() => {
|
||||||
writeResponse(params, resp);
|
writeResponse(params, resp);
|
||||||
resp.finish();
|
resp.finish();
|
||||||
}, timeout, Ci.nsITimer.TYPE_ONE_SHOT);
|
},
|
||||||
|
timeout,
|
||||||
|
Ci.nsITimer.TYPE_ONE_SHOT
|
||||||
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,14 +40,14 @@ function handleRequest(req, resp) {
|
|||||||
function writeResponse(params, resp) {
|
function writeResponse(params, resp) {
|
||||||
// Echo back the search string with "foo" and "bar" appended.
|
// Echo back the search string with "foo" and "bar" appended.
|
||||||
let suffixes = ["foo", "bar"];
|
let suffixes = ["foo", "bar"];
|
||||||
if (params["count"]) {
|
if (params.count) {
|
||||||
// Add more suffixes.
|
// Add more suffixes.
|
||||||
let serial = 0;
|
let serial = 0;
|
||||||
while (suffixes.length < params["count"]) {
|
while (suffixes.length < params.count) {
|
||||||
suffixes.push(++serial);
|
suffixes.push(++serial);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let data = [params["query"], suffixes.map(s => params["query"] + s)];
|
let data = [params.query, suffixes.map(s => params.query + s)];
|
||||||
resp.setHeader("Content-Type", "application/json", false);
|
resp.setHeader("Content-Type", "application/json", false);
|
||||||
resp.write(JSON.stringify(data));
|
resp.write(JSON.stringify(data));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
function handleRequest(aRequest, aResponse) {
|
function handleRequest(aRequest, aResponse) {
|
||||||
aResponse.setStatusLine(aRequest.httpVersion, 302, "Moved");
|
aResponse.setStatusLine(aRequest.httpVersion, 302, "Moved");
|
||||||
aResponse.setHeader("Location", "http://mochi.test:8888/tests/caps/tests/mochitest/file_bug1367586-target.html");
|
aResponse.setHeader(
|
||||||
|
"Location",
|
||||||
|
"http://mochi.test:8888/tests/caps/tests/mochitest/file_bug1367586-target.html"
|
||||||
|
);
|
||||||
aResponse.write("To be redirected to target");
|
aResponse.write("To be redirected to target");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,19 +2,21 @@
|
|||||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
let Etag = '"4d881ab-b03-435f0a0f9ef00"';
|
const Etag = '"4d881ab-b03-435f0a0f9ef00"';
|
||||||
let IfNoneMatch = request.hasHeader("If-None-Match")
|
const IfNoneMatch = request.hasHeader("If-None-Match")
|
||||||
? request.getHeader("If-None-Match")
|
? request.getHeader("If-None-Match")
|
||||||
: "";
|
: "";
|
||||||
|
|
||||||
let guid = 'xxxxxxxx-xxxx-xxxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
|
const guid = "xxxxxxxx-xxxx-xxxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(
|
||||||
let r = Math.random() * 16 | 0;
|
c
|
||||||
let v = c === "x" ? r : (r & 0x3 | 0x8);
|
) {
|
||||||
|
const r = (Math.random() * 16) | 0;
|
||||||
|
const v = c === "x" ? r : (r & 0x3) | 0x8;
|
||||||
|
|
||||||
return v.toString(16);
|
return v.toString(16);
|
||||||
});
|
});
|
||||||
|
|
||||||
let page = "<!DOCTYPE html><html><body><h1>" + guid + "</h1></body></html>";
|
const page = "<!DOCTYPE html><html><body><h1>" + guid + "</h1></body></html>";
|
||||||
|
|
||||||
response.setHeader("Etag", Etag, false);
|
response.setHeader("Etag", Etag, false);
|
||||||
|
|
||||||
|
|||||||
@@ -13,12 +13,15 @@ function handleRequest(request, response) {
|
|||||||
response.setHeader("Access-Control-Allow-Origin", "*", false);
|
response.setHeader("Access-Control-Allow-Origin", "*", false);
|
||||||
|
|
||||||
// Redirect to a different file each time.
|
// Redirect to a different file each time.
|
||||||
let counter = 1 + (+getState("counter") % 2);
|
const counter = 1 + (+getState("counter") % 2);
|
||||||
|
|
||||||
let index = request.path.lastIndexOf("/");
|
const index = request.path.lastIndexOf("/");
|
||||||
let newPath = request.path.substr(0, index + 1) +
|
const newPath =
|
||||||
"code_bundle_reload_" + counter + ".js.map";
|
request.path.substr(0, index + 1) +
|
||||||
let newUrl = request.scheme + "://" + request.host + newPath;
|
"code_bundle_reload_" +
|
||||||
|
counter +
|
||||||
|
".js.map";
|
||||||
|
const newUrl = request.scheme + "://" + request.host + newPath;
|
||||||
|
|
||||||
response.setStatusLine(request.httpVersion, 302, "Found");
|
response.setStatusLine(request.httpVersion, 302, "Found");
|
||||||
response.setHeader("Location", newUrl);
|
response.setHeader("Location", newUrl);
|
||||||
|
|||||||
@@ -13,12 +13,12 @@ function handleRequest(request, response) {
|
|||||||
response.setHeader("Access-Control-Allow-Origin", "*", false);
|
response.setHeader("Access-Control-Allow-Origin", "*", false);
|
||||||
|
|
||||||
// Redirect to a different file each time.
|
// Redirect to a different file each time.
|
||||||
let counter = 1 + (+getState("counter") % 2);
|
const counter = 1 + (+getState("counter") % 2);
|
||||||
|
|
||||||
let index = request.path.lastIndexOf("/");
|
const index = request.path.lastIndexOf("/");
|
||||||
let newPath = request.path.substr(0, index + 1) +
|
const newPath =
|
||||||
"code_bundle_reload_" + counter + ".js";
|
request.path.substr(0, index + 1) + "code_bundle_reload_" + counter + ".js";
|
||||||
let newUrl = request.scheme + "://" + request.host + newPath;
|
const newUrl = request.scheme + "://" + request.host + newPath;
|
||||||
|
|
||||||
response.setStatusLine(request.httpVersion, 302, "Found");
|
response.setStatusLine(request.httpVersion, 302, "Found");
|
||||||
response.setHeader("Location", newUrl);
|
response.setHeader("Location", newUrl);
|
||||||
|
|||||||
@@ -7,12 +7,14 @@ function setResponse(response) {
|
|||||||
}
|
}
|
||||||
function getResponse() {
|
function getResponse() {
|
||||||
let response;
|
let response;
|
||||||
getObjectState(key, v => { response = v });
|
getObjectState(key, v => {
|
||||||
|
response = v;
|
||||||
|
});
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
let {queryString} = request;
|
const { queryString } = request;
|
||||||
if (!queryString) {
|
if (!queryString) {
|
||||||
response.processAsync();
|
response.processAsync();
|
||||||
setResponse(response);
|
setResponse(response);
|
||||||
@@ -21,7 +23,7 @@ function handleRequest(request, response) {
|
|||||||
response.write(" ");
|
response.write(" ");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let [command, value] = queryString.split('=');
|
const [command, value] = queryString.split("=");
|
||||||
switch (command) {
|
switch (command) {
|
||||||
case "write":
|
case "write":
|
||||||
getResponse().write(value);
|
getResponse().write(value);
|
||||||
|
|||||||
@@ -3,7 +3,10 @@
|
|||||||
|
|
||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
response.setStatusLine(request.httpVersion, 304, "Not Modified");
|
response.setStatusLine(request.httpVersion, 304, "Not Modified");
|
||||||
response.setHeader("Cache-Control", "no-transform,public,max-age=300,s-maxage=900");
|
response.setHeader(
|
||||||
|
"Cache-Control",
|
||||||
|
"no-transform,public,max-age=300,s-maxage=900"
|
||||||
|
);
|
||||||
response.setHeader("Expires", "Thu, 01 Dec 2100 20:00:00 GMT");
|
response.setHeader("Expires", "Thu, 01 Dec 2100 20:00:00 GMT");
|
||||||
response.setHeader("Content-Type", "text/plain; charset=utf-8", false);
|
response.setHeader("Content-Type", "text/plain; charset=utf-8", false);
|
||||||
response.write("Hello from cache!");
|
response.write("Hello from cache!");
|
||||||
|
|||||||
@@ -4,16 +4,22 @@
|
|||||||
Cu.importGlobalProperties(["TextEncoder"]);
|
Cu.importGlobalProperties(["TextEncoder"]);
|
||||||
|
|
||||||
function gzipCompressString(string, obs) {
|
function gzipCompressString(string, obs) {
|
||||||
|
const scs = Cc["@mozilla.org/streamConverters;1"].getService(
|
||||||
let scs = Cc["@mozilla.org/streamConverters;1"]
|
Ci.nsIStreamConverterService
|
||||||
.getService(Ci.nsIStreamConverterService);
|
);
|
||||||
let listener = Cc["@mozilla.org/network/stream-loader;1"]
|
const listener = Cc["@mozilla.org/network/stream-loader;1"].createInstance(
|
||||||
.createInstance(Ci.nsIStreamLoader);
|
Ci.nsIStreamLoader
|
||||||
|
);
|
||||||
listener.init(obs);
|
listener.init(obs);
|
||||||
let converter = scs.asyncConvertData("uncompressed", "gzip",
|
const converter = scs.asyncConvertData(
|
||||||
listener, null);
|
"uncompressed",
|
||||||
let stringStream = Cc["@mozilla.org/io/string-input-stream;1"]
|
"gzip",
|
||||||
.createInstance(Ci.nsIStringInputStream);
|
listener,
|
||||||
|
null
|
||||||
|
);
|
||||||
|
const stringStream = Cc[
|
||||||
|
"@mozilla.org/io/string-input-stream;1"
|
||||||
|
].createInstance(Ci.nsIStringInputStream);
|
||||||
stringStream.data = string;
|
stringStream.data = string;
|
||||||
converter.onStartRequest(null);
|
converter.onStartRequest(null);
|
||||||
converter.onDataAvailable(null, stringStream, 0, string.length);
|
converter.onDataAvailable(null, stringStream, 0, string.length);
|
||||||
@@ -21,11 +27,11 @@ function gzipCompressString(string, obs) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function doubleGzipCompressString(string, observer) {
|
function doubleGzipCompressString(string, observer) {
|
||||||
let observer2 = {
|
const observer2 = {
|
||||||
onStreamComplete: function(loader, context, status, length, result) {
|
onStreamComplete: function(loader, context, status, length, result) {
|
||||||
let buffer = String.fromCharCode.apply(this, result);
|
const buffer = String.fromCharCode.apply(this, result);
|
||||||
gzipCompressString(buffer, observer);
|
gzipCompressString(buffer, observer);
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
gzipCompressString(string, observer2);
|
gzipCompressString(string, observer2);
|
||||||
}
|
}
|
||||||
@@ -33,18 +39,25 @@ function doubleGzipCompressString(string, observer) {
|
|||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
response.processAsync();
|
response.processAsync();
|
||||||
|
|
||||||
let params = request.queryString.split("&");
|
const params = request.queryString.split("&");
|
||||||
let format = (params.filter((s) => s.includes("fmt="))[0] || "").split("=")[1];
|
const format = (params.filter(s => s.includes("fmt="))[0] || "").split(
|
||||||
let status = (params.filter((s) => s.includes("sts="))[0] || "").split("=")[1] || 200;
|
"="
|
||||||
let cookies = (params.filter((s) => s.includes("cookies="))[0] || "").split("=")[1] || 0;
|
)[1];
|
||||||
let cors = request.queryString.includes("cors=1");
|
const status =
|
||||||
|
(params.filter(s => s.includes("sts="))[0] || "").split("=")[1] || 200;
|
||||||
|
const cookies =
|
||||||
|
(params.filter(s => s.includes("cookies="))[0] || "").split("=")[1] || 0;
|
||||||
|
const cors = request.queryString.includes("cors=1");
|
||||||
|
|
||||||
let cachedCount = 0;
|
let cachedCount = 0;
|
||||||
let cacheExpire = 60; // seconds
|
const cacheExpire = 60; // seconds
|
||||||
|
|
||||||
function setCacheHeaders() {
|
function setCacheHeaders() {
|
||||||
if (status != 304) {
|
if (status != 304) {
|
||||||
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
|
response.setHeader(
|
||||||
|
"Cache-Control",
|
||||||
|
"no-cache, no-store, must-revalidate"
|
||||||
|
);
|
||||||
response.setHeader("Pragma", "no-cache");
|
response.setHeader("Pragma", "no-cache");
|
||||||
response.setHeader("Expires", "0");
|
response.setHeader("Expires", "0");
|
||||||
return;
|
return;
|
||||||
@@ -53,15 +66,27 @@ function handleRequest(request, response) {
|
|||||||
if (cachedCount % 2) {
|
if (cachedCount % 2) {
|
||||||
response.setHeader("Cache-Control", "max-age=" + cacheExpire, false);
|
response.setHeader("Cache-Control", "max-age=" + cacheExpire, false);
|
||||||
} else {
|
} else {
|
||||||
response.setHeader("Expires", Date(Date.now() + cacheExpire * 1000), false);
|
response.setHeader(
|
||||||
|
"Expires",
|
||||||
|
Date(Date.now() + cacheExpire * 1000),
|
||||||
|
false
|
||||||
|
);
|
||||||
}
|
}
|
||||||
cachedCount++;
|
cachedCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
function setCookieHeaders() {
|
function setCookieHeaders() {
|
||||||
if (cookies) {
|
if (cookies) {
|
||||||
response.setHeader("Set-Cookie", "name1=value1; Domain=.foo.example.com", true);
|
response.setHeader(
|
||||||
response.setHeader("Set-Cookie", "name2=value2; Domain=.example.com", true);
|
"Set-Cookie",
|
||||||
|
"name1=value1; Domain=.foo.example.com",
|
||||||
|
true
|
||||||
|
);
|
||||||
|
response.setHeader(
|
||||||
|
"Set-Cookie",
|
||||||
|
"name2=value2; Domain=.example.com",
|
||||||
|
true
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,7 +97,8 @@ function handleRequest(request, response) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
|
let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
|
||||||
timer.initWithCallback(() => {
|
timer.initWithCallback(
|
||||||
|
() => {
|
||||||
// to avoid garbage collection
|
// to avoid garbage collection
|
||||||
timer = null;
|
timer = null;
|
||||||
switch (format) {
|
switch (format) {
|
||||||
@@ -89,8 +115,8 @@ function handleRequest(request, response) {
|
|||||||
// bytes of the string in UTF-8. If it's evaluated as Latin-1, the
|
// bytes of the string in UTF-8. If it's evaluated as Latin-1, the
|
||||||
// written bytes will be the result of UTF-8-encoding this string
|
// written bytes will be the result of UTF-8-encoding this string
|
||||||
// *twice*.
|
// *twice*.
|
||||||
let data = "Братан, ты вообще качаешься?";
|
const data = "Братан, ты вообще качаешься?";
|
||||||
let stringOfUtf8Bytes = convertToUtf8(data);
|
const stringOfUtf8Bytes = convertToUtf8(data);
|
||||||
response.write(stringOfUtf8Bytes);
|
response.write(stringOfUtf8Bytes);
|
||||||
|
|
||||||
response.finish();
|
response.finish();
|
||||||
@@ -105,7 +131,9 @@ function handleRequest(request, response) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "html": {
|
case "html": {
|
||||||
let content = (params.filter((s) => s.includes("res="))[0] || "").split("=")[1];
|
const content = (
|
||||||
|
params.filter(s => s.includes("res="))[0] || ""
|
||||||
|
).split("=")[1];
|
||||||
response.setStatusLine(request.httpVersion, status, "OK");
|
response.setStatusLine(request.httpVersion, status, "OK");
|
||||||
response.setHeader("Content-Type", "text/html; charset=utf-8", false);
|
response.setHeader("Content-Type", "text/html; charset=utf-8", false);
|
||||||
setAllowOriginHeaders();
|
setAllowOriginHeaders();
|
||||||
@@ -116,7 +144,7 @@ function handleRequest(request, response) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "html-long": {
|
case "html-long": {
|
||||||
let str = new Array(102400 /* 100 KB in bytes */).join(".");
|
const str = new Array(102400 /* 100 KB in bytes */).join(".");
|
||||||
response.setStatusLine(request.httpVersion, status, "OK");
|
response.setStatusLine(request.httpVersion, status, "OK");
|
||||||
response.setHeader("Content-Type", "text/html; charset=utf-8", false);
|
response.setHeader("Content-Type", "text/html; charset=utf-8", false);
|
||||||
setCacheHeaders();
|
setCacheHeaders();
|
||||||
@@ -134,7 +162,11 @@ function handleRequest(request, response) {
|
|||||||
}
|
}
|
||||||
case "js": {
|
case "js": {
|
||||||
response.setStatusLine(request.httpVersion, status, "OK");
|
response.setStatusLine(request.httpVersion, status, "OK");
|
||||||
response.setHeader("Content-Type", "application/javascript; charset=utf-8", false);
|
response.setHeader(
|
||||||
|
"Content-Type",
|
||||||
|
"application/javascript; charset=utf-8",
|
||||||
|
false
|
||||||
|
);
|
||||||
setCacheHeaders();
|
setCacheHeaders();
|
||||||
response.write("function() { return 'Hello JS!'; }");
|
response.write("function() { return 'Hello JS!'; }");
|
||||||
response.finish();
|
response.finish();
|
||||||
@@ -142,27 +174,37 @@ function handleRequest(request, response) {
|
|||||||
}
|
}
|
||||||
case "json": {
|
case "json": {
|
||||||
response.setStatusLine(request.httpVersion, status, "OK");
|
response.setStatusLine(request.httpVersion, status, "OK");
|
||||||
response.setHeader("Content-Type", "application/json; charset=utf-8", false);
|
response.setHeader(
|
||||||
|
"Content-Type",
|
||||||
|
"application/json; charset=utf-8",
|
||||||
|
false
|
||||||
|
);
|
||||||
setCacheHeaders();
|
setCacheHeaders();
|
||||||
response.write("{ \"greeting\": \"Hello JSON!\" }");
|
response.write('{ "greeting": "Hello JSON!" }');
|
||||||
response.finish();
|
response.finish();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "jsonp": {
|
case "jsonp": {
|
||||||
let fun = (params.filter((s) => s.includes("jsonp="))[0] || "").split("=")[1];
|
const fun = (params.filter(s => s.includes("jsonp="))[0] || "").split(
|
||||||
|
"="
|
||||||
|
)[1];
|
||||||
response.setStatusLine(request.httpVersion, status, "OK");
|
response.setStatusLine(request.httpVersion, status, "OK");
|
||||||
response.setHeader("Content-Type", "text/json; charset=utf-8", false);
|
response.setHeader("Content-Type", "text/json; charset=utf-8", false);
|
||||||
setCacheHeaders();
|
setCacheHeaders();
|
||||||
response.write(fun + "({ \"greeting\": \"Hello JSONP!\" })");
|
response.write(fun + '({ "greeting": "Hello JSONP!" })');
|
||||||
response.finish();
|
response.finish();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "jsonp2": {
|
case "jsonp2": {
|
||||||
let fun = (params.filter((s) => s.includes("jsonp="))[0] || "").split("=")[1];
|
const fun = (params.filter(s => s.includes("jsonp="))[0] || "").split(
|
||||||
|
"="
|
||||||
|
)[1];
|
||||||
response.setStatusLine(request.httpVersion, status, "OK");
|
response.setStatusLine(request.httpVersion, status, "OK");
|
||||||
response.setHeader("Content-Type", "text/json; charset=utf-8", false);
|
response.setHeader("Content-Type", "text/json; charset=utf-8", false);
|
||||||
setCacheHeaders();
|
setCacheHeaders();
|
||||||
response.write(" " + fun + " ( { \"greeting\": \"Hello weird JSONP!\" } ) ; ");
|
response.write(
|
||||||
|
" " + fun + ' ( { "greeting": "Hello weird JSONP!" } ) ; '
|
||||||
|
);
|
||||||
response.finish();
|
response.finish();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -170,12 +212,12 @@ function handleRequest(request, response) {
|
|||||||
response.setStatusLine(request.httpVersion, status, "OK");
|
response.setStatusLine(request.httpVersion, status, "OK");
|
||||||
response.setHeader("Content-Type", "text/json; charset=utf-8", false);
|
response.setHeader("Content-Type", "text/json; charset=utf-8", false);
|
||||||
setCacheHeaders();
|
setCacheHeaders();
|
||||||
response.write(btoa("{ \"greeting\": \"This is a base 64 string.\" }"));
|
response.write(btoa('{ "greeting": "This is a base 64 string." }'));
|
||||||
response.finish();
|
response.finish();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "json-long": {
|
case "json-long": {
|
||||||
let str = "{ \"greeting\": \"Hello long string JSON!\" },";
|
const str = '{ "greeting": "Hello long string JSON!" },';
|
||||||
response.setStatusLine(request.httpVersion, status, "OK");
|
response.setStatusLine(request.httpVersion, status, "OK");
|
||||||
response.setHeader("Content-Type", "text/json; charset=utf-8", false);
|
response.setHeader("Content-Type", "text/json; charset=utf-8", false);
|
||||||
setCacheHeaders();
|
setCacheHeaders();
|
||||||
@@ -187,23 +229,31 @@ function handleRequest(request, response) {
|
|||||||
response.setStatusLine(request.httpVersion, status, "OK");
|
response.setStatusLine(request.httpVersion, status, "OK");
|
||||||
response.setHeader("Content-Type", "text/json; charset=utf-8", false);
|
response.setHeader("Content-Type", "text/json; charset=utf-8", false);
|
||||||
setCacheHeaders();
|
setCacheHeaders();
|
||||||
response.write("{ \"greeting\": \"Hello malformed JSON!\" },");
|
response.write('{ "greeting": "Hello malformed JSON!" },');
|
||||||
response.finish();
|
response.finish();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "json-text-mime": {
|
case "json-text-mime": {
|
||||||
response.setStatusLine(request.httpVersion, status, "OK");
|
response.setStatusLine(request.httpVersion, status, "OK");
|
||||||
response.setHeader("Content-Type", "text/plain; charset=utf-8", false);
|
response.setHeader(
|
||||||
|
"Content-Type",
|
||||||
|
"text/plain; charset=utf-8",
|
||||||
|
false
|
||||||
|
);
|
||||||
setCacheHeaders();
|
setCacheHeaders();
|
||||||
response.write("{ \"greeting\": \"Hello third-party JSON!\" }");
|
response.write('{ "greeting": "Hello third-party JSON!" }');
|
||||||
response.finish();
|
response.finish();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "json-custom-mime": {
|
case "json-custom-mime": {
|
||||||
response.setStatusLine(request.httpVersion, status, "OK");
|
response.setStatusLine(request.httpVersion, status, "OK");
|
||||||
response.setHeader("Content-Type", "text/x-bigcorp-json; charset=utf-8", false);
|
response.setHeader(
|
||||||
|
"Content-Type",
|
||||||
|
"text/x-bigcorp-json; charset=utf-8",
|
||||||
|
false
|
||||||
|
);
|
||||||
setCacheHeaders();
|
setCacheHeaders();
|
||||||
response.write("{ \"greeting\": \"Hello oddly-named JSON!\" }");
|
response.write('{ "greeting": "Hello oddly-named JSON!" }');
|
||||||
response.finish();
|
response.finish();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -238,13 +288,21 @@ function handleRequest(request, response) {
|
|||||||
}
|
}
|
||||||
case "flash": {
|
case "flash": {
|
||||||
response.setStatusLine(request.httpVersion, status, "OK");
|
response.setStatusLine(request.httpVersion, status, "OK");
|
||||||
response.setHeader("Content-Type", "application/x-shockwave-flash", false);
|
response.setHeader(
|
||||||
|
"Content-Type",
|
||||||
|
"application/x-shockwave-flash",
|
||||||
|
false
|
||||||
|
);
|
||||||
setCacheHeaders();
|
setCacheHeaders();
|
||||||
response.finish();
|
response.finish();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "ws": {
|
case "ws": {
|
||||||
response.setStatusLine(request.httpVersion, 101, "Switching Protocols");
|
response.setStatusLine(
|
||||||
|
request.httpVersion,
|
||||||
|
101,
|
||||||
|
"Switching Protocols"
|
||||||
|
);
|
||||||
response.setHeader("Connection", "upgrade", false);
|
response.setHeader("Connection", "upgrade", false);
|
||||||
response.setHeader("Upgrade", "websocket", false);
|
response.setHeader("Upgrade", "websocket", false);
|
||||||
setCacheHeaders();
|
setCacheHeaders();
|
||||||
@@ -258,15 +316,21 @@ function handleRequest(request, response) {
|
|||||||
response.setHeader("Content-Type", "text/plain", false);
|
response.setHeader("Content-Type", "text/plain", false);
|
||||||
response.setHeader("Content-Encoding", "gzip\t ,gzip", false);
|
response.setHeader("Content-Encoding", "gzip\t ,gzip", false);
|
||||||
setCacheHeaders();
|
setCacheHeaders();
|
||||||
let observer = {
|
const observer = {
|
||||||
onStreamComplete: function(loader, context, status, length, result) {
|
onStreamComplete: function(
|
||||||
let buffer = String.fromCharCode.apply(this, result);
|
loader,
|
||||||
|
context,
|
||||||
|
status,
|
||||||
|
length,
|
||||||
|
result
|
||||||
|
) {
|
||||||
|
const buffer = String.fromCharCode.apply(this, result);
|
||||||
response.setHeader("Content-Length", "" + buffer.length, false);
|
response.setHeader("Content-Length", "" + buffer.length, false);
|
||||||
response.write(buffer);
|
response.write(buffer);
|
||||||
response.finish();
|
response.finish();
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
let data = new Array(1000).join("Hello gzip!");
|
const data = new Array(1000).join("Hello gzip!");
|
||||||
doubleGzipCompressString(data, observer);
|
doubleGzipCompressString(data, observer);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -291,7 +355,11 @@ function handleRequest(request, response) {
|
|||||||
}
|
}
|
||||||
case "hls-m3u8-alt-mime-type": {
|
case "hls-m3u8-alt-mime-type": {
|
||||||
response.setStatusLine(request.httpVersion, status, "OK");
|
response.setStatusLine(request.httpVersion, status, "OK");
|
||||||
response.setHeader("Content-Type", "application/vnd.apple.mpegurl", false);
|
response.setHeader(
|
||||||
|
"Content-Type",
|
||||||
|
"application/vnd.apple.mpegurl",
|
||||||
|
false
|
||||||
|
);
|
||||||
setCacheHeaders();
|
setCacheHeaders();
|
||||||
response.write("#EXTM3U\n");
|
response.write("#EXTM3U\n");
|
||||||
response.finish();
|
response.finish();
|
||||||
@@ -302,7 +370,9 @@ function handleRequest(request, response) {
|
|||||||
response.setHeader("Content-Type", "video/vnd.mpeg.dash.mpd", false);
|
response.setHeader("Content-Type", "video/vnd.mpeg.dash.mpd", false);
|
||||||
setCacheHeaders();
|
setCacheHeaders();
|
||||||
response.write('<?xml version="1.0" encoding="UTF-8"?>\n');
|
response.write('<?xml version="1.0" encoding="UTF-8"?>\n');
|
||||||
response.write('<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></MPD>\n');
|
response.write(
|
||||||
|
'<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></MPD>\n'
|
||||||
|
);
|
||||||
response.finish();
|
response.finish();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -315,5 +385,8 @@ function handleRequest(request, response) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, 10, Ci.nsITimer.TYPE_ONE_SHOT); // Make sure this request takes a few ms.
|
},
|
||||||
|
10,
|
||||||
|
Ci.nsITimer.TYPE_ONE_SHOT
|
||||||
|
); // Make sure this request takes a few ms.
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,5 +15,4 @@ function handleRequest(request, response) {
|
|||||||
response.setStatusLine(request.httpVersion, 200, "OK");
|
response.setStatusLine(request.httpVersion, 200, "OK");
|
||||||
response.write("Page was accessed over HTTPS!");
|
response.write("Page was accessed over HTTPS!");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
|
|
||||||
response.setStatusLine(request.httpVersion, 200, "OK");
|
response.setStatusLine(request.httpVersion, 200, "OK");
|
||||||
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
|
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
|
||||||
response.setHeader("Pragma", "no-cache");
|
response.setHeader("Pragma", "no-cache");
|
||||||
@@ -12,14 +11,14 @@ function handleRequest(request, response) {
|
|||||||
|
|
||||||
// This server checks the name parameter from the request to decide which JSON object to
|
// This server checks the name parameter from the request to decide which JSON object to
|
||||||
// return.
|
// return.
|
||||||
let params = request.queryString.split("&");
|
const params = request.queryString.split("&");
|
||||||
let name = (params.filter((s) => s.includes("name="))[0] || "").split("=")[1];
|
const name = (params.filter(s => s.includes("name="))[0] || "").split("=")[1];
|
||||||
switch (name) {
|
switch (name) {
|
||||||
case "null":
|
case "null":
|
||||||
response.write("{ \"greeting\": null }");
|
response.write('{ "greeting": null }');
|
||||||
break;
|
break;
|
||||||
case "nogrip":
|
case "nogrip":
|
||||||
response.write("{\"obj\": {\"type\": \"string\" }}");
|
response.write('{"obj": {"type": "string" }}');
|
||||||
break;
|
break;
|
||||||
case "empty":
|
case "empty":
|
||||||
response.write("{}");
|
response.write("{}");
|
||||||
|
|||||||
@@ -3,9 +3,11 @@
|
|||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
const CC = Components.Constructor;
|
const CC = Components.Constructor;
|
||||||
const BinaryInputStream = CC("@mozilla.org/binaryinputstream;1",
|
const BinaryInputStream = CC(
|
||||||
|
"@mozilla.org/binaryinputstream;1",
|
||||||
"nsIBinaryInputStream",
|
"nsIBinaryInputStream",
|
||||||
"setInputStream");
|
"setInputStream"
|
||||||
|
);
|
||||||
|
|
||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
response.setStatusLine(request.httpVersion, 200, "Och Aye");
|
response.setStatusLine(request.httpVersion, 200, "Och Aye");
|
||||||
@@ -14,12 +16,18 @@ function handleRequest(request, response) {
|
|||||||
var body = "";
|
var body = "";
|
||||||
if (request.method == "POST") {
|
if (request.method == "POST") {
|
||||||
var bodyStream = new BinaryInputStream(request.bodyInputStream);
|
var bodyStream = new BinaryInputStream(request.bodyInputStream);
|
||||||
var bytes = [], avail = 0;
|
var bytes = [],
|
||||||
|
avail = 0;
|
||||||
while ((avail = bodyStream.available()) > 0) {
|
while ((avail = bodyStream.available()) > 0) {
|
||||||
body += String.fromCharCode.apply(String, bodyStream.readByteArray(avail));
|
body += String.fromCharCode.apply(
|
||||||
|
String,
|
||||||
|
bodyStream.readByteArray(avail)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var contentType = request.hasHeader("content-type") ? request.getHeader("content-type") : ""
|
var contentType = request.hasHeader("content-type")
|
||||||
|
? request.getHeader("content-type")
|
||||||
|
: "";
|
||||||
var bodyOutput = [request.method, contentType, body].join("\n");
|
var bodyOutput = [request.method, contentType, body].join("\n");
|
||||||
|
|
||||||
response.bodyOutputStream.write(bodyOutput, bodyOutput.length);
|
response.bodyOutputStream.write(bodyOutput, bodyOutput.length);
|
||||||
|
|||||||
@@ -9,9 +9,13 @@ const DELAY_MS = 2000;
|
|||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
response.processAsync();
|
response.processAsync();
|
||||||
timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
|
timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
|
||||||
timer.init(() => {
|
timer.init(
|
||||||
|
() => {
|
||||||
response.setHeader("Content-Type", "text/javascript", false);
|
response.setHeader("Content-Type", "text/javascript", false);
|
||||||
response.write("console.log('script loaded')\n");
|
response.write("console.log('script loaded')\n");
|
||||||
response.finish();
|
response.finish();
|
||||||
}, DELAY_MS, Ci.nsITimer.TYPE_ONE_SHOT);
|
},
|
||||||
|
DELAY_MS,
|
||||||
|
Ci.nsITimer.TYPE_ONE_SHOT
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,9 +9,15 @@ const DELAY_MS = 10000;
|
|||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
response.processAsync();
|
response.processAsync();
|
||||||
timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
|
timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
|
||||||
timer.init(() => {
|
timer.init(
|
||||||
|
() => {
|
||||||
response.setHeader("Content-Type", "text/html", false);
|
response.setHeader("Content-Type", "text/html", false);
|
||||||
response.write("<body>Slow loading page for netmonitor test. You should never see this.</body>");
|
response.write(
|
||||||
|
"<body>Slow loading page for netmonitor test. You should never see this.</body>"
|
||||||
|
);
|
||||||
response.finish();
|
response.finish();
|
||||||
}, DELAY_MS, Ci.nsITimer.TYPE_ONE_SHOT);
|
},
|
||||||
|
DELAY_MS,
|
||||||
|
Ci.nsITimer.TYPE_ONE_SHOT
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,21 +4,32 @@
|
|||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
response.processAsync();
|
response.processAsync();
|
||||||
|
|
||||||
let params = request.queryString.split("&");
|
const params = request.queryString.split("&");
|
||||||
let index = params.filter((s) => s.includes("index="))[0].split("=")[1];
|
const index = params.filter(s => s.includes("index="))[0].split("=")[1];
|
||||||
|
|
||||||
let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
|
let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
|
||||||
timer.initWithCallback(() => {
|
timer.initWithCallback(
|
||||||
|
() => {
|
||||||
// to avoid garbage collection
|
// to avoid garbage collection
|
||||||
timer = null;
|
timer = null;
|
||||||
response.setStatusLine(request.httpVersion, index == 1 ? 101 : index * 100, "Meh");
|
response.setStatusLine(
|
||||||
|
request.httpVersion,
|
||||||
|
index == 1 ? 101 : index * 100,
|
||||||
|
"Meh"
|
||||||
|
);
|
||||||
|
|
||||||
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
|
response.setHeader(
|
||||||
|
"Cache-Control",
|
||||||
|
"no-cache, no-store, must-revalidate"
|
||||||
|
);
|
||||||
response.setHeader("Pragma", "no-cache");
|
response.setHeader("Pragma", "no-cache");
|
||||||
response.setHeader("Expires", "0");
|
response.setHeader("Expires", "0");
|
||||||
|
|
||||||
response.setHeader("Content-Type", "text/" + index, false);
|
response.setHeader("Content-Type", "text/" + index, false);
|
||||||
response.write(new Array(index * 10).join(index)); // + 0.01 KB
|
response.write(new Array(index * 10).join(index)); // + 0.01 KB
|
||||||
response.finish();
|
response.finish();
|
||||||
}, 10, Ci.nsITimer.TYPE_ONE_SHOT); // Make sure this request takes a few ms.
|
},
|
||||||
|
10,
|
||||||
|
Ci.nsITimer.TYPE_ONE_SHOT
|
||||||
|
); // Make sure this request takes a few ms.
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,17 +4,22 @@
|
|||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
response.processAsync();
|
response.processAsync();
|
||||||
|
|
||||||
let params = request.queryString.split("&");
|
const params = request.queryString.split("&");
|
||||||
let status = params.filter(s => s.includes("sts="))[0].split("=")[1];
|
const status = params.filter(s => s.includes("sts="))[0].split("=")[1];
|
||||||
let cached = params.filter(s => s === 'cached').length !== 0;
|
const cached = params.filter(s => s === "cached").length !== 0;
|
||||||
|
|
||||||
let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
|
let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
|
||||||
timer.initWithCallback(() => {
|
timer.initWithCallback(
|
||||||
|
() => {
|
||||||
// to avoid garbage collection
|
// to avoid garbage collection
|
||||||
timer = null;
|
timer = null;
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case "100":
|
case "100":
|
||||||
response.setStatusLine(request.httpVersion, 101, "Switching Protocols");
|
response.setStatusLine(
|
||||||
|
request.httpVersion,
|
||||||
|
101,
|
||||||
|
"Switching Protocols"
|
||||||
|
);
|
||||||
break;
|
break;
|
||||||
case "200":
|
case "200":
|
||||||
response.setStatusLine(request.httpVersion, 202, "Created");
|
response.setStatusLine(request.httpVersion, 202, "Created");
|
||||||
@@ -41,17 +46,25 @@ function handleRequest(request, response) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!cached) {
|
if (!cached) {
|
||||||
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
|
response.setHeader(
|
||||||
|
"Cache-Control",
|
||||||
|
"no-cache, no-store, must-revalidate"
|
||||||
|
);
|
||||||
response.setHeader("Pragma", "no-cache");
|
response.setHeader("Pragma", "no-cache");
|
||||||
response.setHeader("Expires", "0");
|
response.setHeader("Expires", "0");
|
||||||
}
|
} else {
|
||||||
else {
|
response.setHeader(
|
||||||
response.setHeader("Cache-Control", "no-transform,public,max-age=300,s-maxage=900");
|
"Cache-Control",
|
||||||
|
"no-transform,public,max-age=300,s-maxage=900"
|
||||||
|
);
|
||||||
response.setHeader("Expires", "Thu, 01 Dec 2100 20:00:00 GMT");
|
response.setHeader("Expires", "Thu, 01 Dec 2100 20:00:00 GMT");
|
||||||
}
|
}
|
||||||
|
|
||||||
response.setHeader("Content-Type", "text/plain; charset=utf-8", false);
|
response.setHeader("Content-Type", "text/plain; charset=utf-8", false);
|
||||||
response.write("Hello status code " + status + "!");
|
response.write("Hello status code " + status + "!");
|
||||||
response.finish();
|
response.finish();
|
||||||
}, 10, Ci.nsITimer.TYPE_ONE_SHOT); // Make sure this request takes a few ms.
|
},
|
||||||
|
10,
|
||||||
|
Ci.nsITimer.TYPE_ONE_SHOT
|
||||||
|
); // Make sure this request takes a few ms.
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
|
|
||||||
var trailerServerTiming = [
|
var trailerServerTiming = [
|
||||||
{ metric: "metric3", duration: "99789.11", description: "time3" },
|
{ metric: "metric3", duration: "99789.11", description: "time3" },
|
||||||
{metric:"metric4", duration:"1112.13", description:"time4"}
|
{ metric: "metric4", duration: "1112.13", description: "time4" },
|
||||||
];
|
];
|
||||||
|
|
||||||
var responseServerTiming = [
|
var responseServerTiming = [
|
||||||
{ metric: "metric1", duration: "123.4", description: "time1" },
|
{ metric: "metric1", duration: "123.4", description: "time1" },
|
||||||
{metric:"metric2", duration:"0", description:"time2"}
|
{ metric: "metric2", duration: "0", description: "time2" },
|
||||||
];
|
];
|
||||||
|
|
||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
@@ -29,9 +29,16 @@ function handleRequest(request, response) {
|
|||||||
function createServerTimingHeader(headerData) {
|
function createServerTimingHeader(headerData) {
|
||||||
var header = "";
|
var header = "";
|
||||||
for (var i = 0; i < headerData.length; i++) {
|
for (var i = 0; i < headerData.length; i++) {
|
||||||
header += "Server-Timing: " + headerData[i].metric + ";" +
|
header +=
|
||||||
"dur=" + headerData[i].duration + ";" +
|
"Server-Timing: " +
|
||||||
"desc=" + headerData[i].description + "\r\n";
|
headerData[i].metric +
|
||||||
|
";" +
|
||||||
|
"dur=" +
|
||||||
|
headerData[i].duration +
|
||||||
|
";" +
|
||||||
|
"desc=" +
|
||||||
|
headerData[i].description +
|
||||||
|
"\r\n";
|
||||||
}
|
}
|
||||||
return header;
|
return header;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,8 +2,10 @@
|
|||||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
let params = request.queryString.split("&");
|
const params = request.queryString.split("&");
|
||||||
let limit = (params.filter((s) => s.includes("limit="))[0] || "").split("=")[1];
|
const limit = (params.filter(s => s.includes("limit="))[0] || "").split(
|
||||||
|
"="
|
||||||
|
)[1];
|
||||||
|
|
||||||
response.setStatusLine(request.httpVersion, 200, "Och Aye");
|
response.setStatusLine(request.httpVersion, 200, "Och Aye");
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,13 @@
|
|||||||
/* Any copyright is dedicated to the Public Domain.
|
/* Any copyright is dedicated to the Public Domain.
|
||||||
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
response.setHeader("Content-Type", "text/plain; charset=utf-8", false);
|
response.setHeader("Content-Type", "text/plain; charset=utf-8", false);
|
||||||
|
|
||||||
let issue;
|
let issue;
|
||||||
switch (request.queryString) {
|
switch (request.queryString) {
|
||||||
case "badSyntax":
|
case "badSyntax":
|
||||||
response.setHeader("Strict-Transport-Security", "\"");
|
response.setHeader("Strict-Transport-Security", '"');
|
||||||
issue = "is not syntactically correct.";
|
issue = "is not syntactically correct.";
|
||||||
break;
|
break;
|
||||||
case "noMaxAge":
|
case "noMaxAge":
|
||||||
@@ -24,13 +23,17 @@ function handleRequest(request, response)
|
|||||||
issue = "includes an invalid max-age directive.";
|
issue = "includes an invalid max-age directive.";
|
||||||
break;
|
break;
|
||||||
case "multipleIncludeSubDomains":
|
case "multipleIncludeSubDomains":
|
||||||
response.setHeader("Strict-Transport-Security",
|
response.setHeader(
|
||||||
"includeSubDomains; includeSubDomains");
|
"Strict-Transport-Security",
|
||||||
|
"includeSubDomains; includeSubDomains"
|
||||||
|
);
|
||||||
issue = "includes multiple includeSubDomains directives.";
|
issue = "includes multiple includeSubDomains directives.";
|
||||||
break;
|
break;
|
||||||
case "multipleMaxAge":
|
case "multipleMaxAge":
|
||||||
response.setHeader("Strict-Transport-Security",
|
response.setHeader(
|
||||||
"max-age=444; max-age=999");
|
"Strict-Transport-Security",
|
||||||
|
"max-age=444; max-age=999"
|
||||||
|
);
|
||||||
issue = "includes multiple max-age directives.";
|
issue = "includes multiple max-age directives.";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,16 +5,18 @@
|
|||||||
|
|
||||||
// A 1x1 PNG image.
|
// A 1x1 PNG image.
|
||||||
// Source: https://commons.wikimedia.org/wiki/File:1x1.png (Public Domain)
|
// Source: https://commons.wikimedia.org/wiki/File:1x1.png (Public Domain)
|
||||||
const IMAGE = atob("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAA" +
|
const IMAGE = atob(
|
||||||
"ACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=");
|
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAA" +
|
||||||
|
"ACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII="
|
||||||
|
);
|
||||||
|
|
||||||
// To avoid GC.
|
// To avoid GC.
|
||||||
let timer = null;
|
let timer = null;
|
||||||
|
|
||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
let query = {};
|
const query = {};
|
||||||
request.queryString.split("&").forEach(function(val) {
|
request.queryString.split("&").forEach(function(val) {
|
||||||
let [name, value] = val.split("=");
|
const [name, value] = val.split("=");
|
||||||
query[name] = unescape(value);
|
query[name] = unescape(value);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -33,8 +35,12 @@ function handleRequest(request, response) {
|
|||||||
const nsITimer = Components.interfaces.nsITimer;
|
const nsITimer = Components.interfaces.nsITimer;
|
||||||
|
|
||||||
timer = Components.classes["@mozilla.org/timer;1"].createInstance(nsITimer);
|
timer = Components.classes["@mozilla.org/timer;1"].createInstance(nsITimer);
|
||||||
timer.initWithCallback(function() {
|
timer.initWithCallback(
|
||||||
|
function() {
|
||||||
response.write(IMAGE);
|
response.write(IMAGE);
|
||||||
response.finish();
|
response.finish();
|
||||||
}, query.delay, nsITimer.TYPE_ONE_SHOT);
|
},
|
||||||
|
query.delay,
|
||||||
|
nsITimer.TYPE_ONE_SHOT
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
Components.utils.importGlobalProperties(["URLSearchParams"]);
|
Components.utils.importGlobalProperties(["URLSearchParams"]);
|
||||||
|
|
||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
let params = new URLSearchParams(request.queryString);
|
const params = new URLSearchParams(request.queryString);
|
||||||
|
|
||||||
switch (params.get("test")) {
|
switch (params.get("test")) {
|
||||||
case "cache":
|
case "cache":
|
||||||
@@ -22,7 +22,9 @@ function handleCacheTestRequest(request, response) {
|
|||||||
response.setHeader("Content-Type", "text/plain; charset=UTF-8", false);
|
response.setHeader("Content-Type", "text/plain; charset=UTF-8", false);
|
||||||
|
|
||||||
if (request.hasHeader("pragma") && request.hasHeader("cache-control")) {
|
if (request.hasHeader("pragma") && request.hasHeader("cache-control")) {
|
||||||
response.write(`${request.getHeader("pragma")}:${request.getHeader("cache-control")}`);
|
response.write(
|
||||||
|
`${request.getHeader("pragma")}:${request.getHeader("cache-control")}`
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
response.write("empty cache headers");
|
response.write("empty cache headers");
|
||||||
}
|
}
|
||||||
@@ -47,11 +49,12 @@ function handleInjectedScriptTestRequest(request, response, params) {
|
|||||||
if (frames > 0) {
|
if (frames > 0) {
|
||||||
// Output an iframe in seamless mode, so that there is an higher chance that in case
|
// Output an iframe in seamless mode, so that there is an higher chance that in case
|
||||||
// of test failures we get a screenshot where the nested iframes are all visible.
|
// of test failures we get a screenshot where the nested iframes are all visible.
|
||||||
content = `<iframe seamless src="?test=injected-script&frames=${frames - 1}"></iframe>`;
|
content = `<iframe seamless src="?test=injected-script&frames=${frames -
|
||||||
|
1}"></iframe>`;
|
||||||
} else {
|
} else {
|
||||||
// Output an about:srcdoc frame to be sure that inspectedWindow.eval is able to
|
// Output an about:srcdoc frame to be sure that inspectedWindow.eval is able to
|
||||||
// evaluate js code into it.
|
// evaluate js code into it.
|
||||||
let srcdoc = `
|
const srcdoc = `
|
||||||
<pre>injected script NOT executed</pre>
|
<pre>injected script NOT executed</pre>
|
||||||
<script>window.pageScriptExecutedFirst = true</script>
|
<script>window.pageScriptExecutedFirst = true</script>
|
||||||
`;
|
`;
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
let Etag = '"4d881ab-b03-435f0a0f9ef00"';
|
const Etag = '"4d881ab-b03-435f0a0f9ef00"';
|
||||||
let IfNoneMatch = request.hasHeader("If-None-Match")
|
const IfNoneMatch = request.hasHeader("If-None-Match")
|
||||||
? request.getHeader("If-None-Match")
|
? request.getHeader("If-None-Match")
|
||||||
: "";
|
: "";
|
||||||
|
|
||||||
var counter = getState("cache-counter") || 1;
|
var counter = getState("cache-counter") || 1;
|
||||||
let page = "<script>var jsValue = '" + counter + "';</script>" + counter;
|
const page = "<script>var jsValue = '" + counter + "';</script>" + counter;
|
||||||
|
|
||||||
setState("cache-counter", "" + (parseInt(counter) + 1));
|
setState("cache-counter", "" + (parseInt(counter) + 1));
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1,7 +1,10 @@
|
|||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
if (getState("reloaded") == "reloaded") {
|
if (getState("reloaded") == "reloaded") {
|
||||||
response.setHeader("Content-Type", "text/html; charset=windows-1254", false);
|
response.setHeader(
|
||||||
|
"Content-Type",
|
||||||
|
"text/html; charset=windows-1254",
|
||||||
|
false
|
||||||
|
);
|
||||||
response.write("\u00E4");
|
response.write("\u00E4");
|
||||||
} else {
|
} else {
|
||||||
response.setHeader("Content-Type", "text/html; charset=Shift_JIS", false);
|
response.setHeader("Content-Type", "text/html; charset=Shift_JIS", false);
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
if (getState("reloaded") == "reloaded") {
|
if (getState("reloaded") == "reloaded") {
|
||||||
response.setHeader("Content-Type", "text/html", false);
|
response.setHeader("Content-Type", "text/html", false);
|
||||||
response.write("<meta charset=iso-2022-kr>\u00E4");
|
response.write("<meta charset=iso-2022-kr>\u00E4");
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
if (getState("reloaded") == "reloaded") {
|
if (getState("reloaded") == "reloaded") {
|
||||||
response.setHeader("Content-Type", "text/html; charset=iso-2022-kr", false);
|
response.setHeader("Content-Type", "text/html; charset=iso-2022-kr", false);
|
||||||
response.write("\u00E4");
|
response.write("\u00E4");
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
if (getState("reloaded") == "reloaded") {
|
if (getState("reloaded") == "reloaded") {
|
||||||
response.setHeader("Content-Type", "text/html", false);
|
response.setHeader("Content-Type", "text/html", false);
|
||||||
response.write("\u00FE\u00FF\u00E4");
|
response.write("\u00FE\u00FF\u00E4");
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
const CC = Components.Constructor;
|
const CC = Components.Constructor;
|
||||||
const BinaryInputStream = CC("@mozilla.org/binaryinputstream;1",
|
const BinaryInputStream = CC(
|
||||||
|
"@mozilla.org/binaryinputstream;1",
|
||||||
"nsIBinaryInputStream",
|
"nsIBinaryInputStream",
|
||||||
"setInputStream");
|
"setInputStream"
|
||||||
|
);
|
||||||
|
|
||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
response.setHeader("Content-Type", "text/plain", false);
|
response.setHeader("Content-Type", "text/plain", false);
|
||||||
@@ -13,8 +15,9 @@ function handleRequest(request, response) {
|
|||||||
var avail;
|
var avail;
|
||||||
var bytes = [];
|
var bytes = [];
|
||||||
|
|
||||||
while ((avail = body.available()) > 0)
|
while ((avail = body.available()) > 0) {
|
||||||
Array.prototype.push.apply(bytes, body.readByteArray(avail));
|
Array.prototype.push.apply(bytes, body.readByteArray(avail));
|
||||||
|
}
|
||||||
|
|
||||||
var data = String.fromCharCode.apply(null, bytes);
|
var data = String.fromCharCode.apply(null, bytes);
|
||||||
response.bodyOutputStream.write(data, data.length);
|
response.bodyOutputStream.write(data, data.length);
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
var redirectstate = "/docshell/test/chrome/bug89419.sjs";
|
var redirectstate = "/docshell/test/chrome/bug89419.sjs";
|
||||||
response.setStatusLine("1.1", 302, "Found");
|
response.setStatusLine("1.1", 302, "Found");
|
||||||
if (getState(redirectstate) == "") {
|
if (getState(redirectstate) == "") {
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
response.setHeader("Content-Type", "text/html");
|
response.setHeader("Content-Type", "text/html");
|
||||||
response.write("<body onload='window.parent.onloadCount++'>" +
|
response.write(
|
||||||
request.method + " " +
|
"<body onload='window.parent.onloadCount++'>" +
|
||||||
|
request.method +
|
||||||
|
" " +
|
||||||
Date.now() +
|
Date.now() +
|
||||||
"</body>");
|
"</body>"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,12 +3,14 @@ function handleRequest(request, response) {
|
|||||||
response.setHeader("Cache-Control", "no-cache");
|
response.setHeader("Cache-Control", "no-cache");
|
||||||
response.write("<body onload='");
|
response.write("<body onload='");
|
||||||
|
|
||||||
if (!request.hasHeader('Referer')) {
|
if (!request.hasHeader("Referer")) {
|
||||||
response.write("window.parent.onloadCount++;");
|
response.write("window.parent.onloadCount++;");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request.queryString == "newwindow") {
|
if (request.queryString == "newwindow") {
|
||||||
response.write("if (window.opener) { window.opener.parent.onloadCount++; window.opener.parent.doNextStep(); }");
|
response.write(
|
||||||
|
"if (window.opener) { window.opener.parent.onloadCount++; window.opener.parent.doNextStep(); }"
|
||||||
|
);
|
||||||
response.write("if (!window.opener) window.close();");
|
response.write("if (!window.opener) window.close();");
|
||||||
response.write("'>");
|
response.write("'>");
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -2,7 +2,8 @@
|
|||||||
|
|
||||||
let self = this;
|
let self = this;
|
||||||
|
|
||||||
Cu.import("resource://gre/modules/Timer.jsm");
|
// eslint-disable-next-line mozilla/use-chromeutils-import
|
||||||
|
let { setTimeout } = Cu.import("resource://gre/modules/Timer.jsm");
|
||||||
|
|
||||||
const CC = Components.Constructor;
|
const CC = Components.Constructor;
|
||||||
const BinaryInputStream = CC(
|
const BinaryInputStream = CC(
|
||||||
@@ -26,7 +27,7 @@ function* generateBody(fragments, size) {
|
|||||||
let chunkSize = (size / fragments) | 0;
|
let chunkSize = (size / fragments) | 0;
|
||||||
let remaining = size;
|
let remaining = size;
|
||||||
|
|
||||||
log(`Chunk size ${chunkSize}`)
|
log(`Chunk size ${chunkSize}`);
|
||||||
while (remaining > 0) {
|
while (remaining > 0) {
|
||||||
let data = new Uint8Array(Math.min(remaining, chunkSize));
|
let data = new Uint8Array(Math.min(remaining, chunkSize));
|
||||||
for (let i = 0; i < data.length; ++i) {
|
for (let i = 0; i < data.length; ++i) {
|
||||||
@@ -35,7 +36,7 @@ function* generateBody(fragments, size) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
yield data;
|
yield data;
|
||||||
log(`Remaining to chunk ${remaining}`)
|
log(`Remaining to chunk ${remaining}`);
|
||||||
remaining -= data.length;
|
remaining -= data.length;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -47,7 +48,7 @@ function readStream(inputStream) {
|
|||||||
result.push(inputStream.readBytes(available));
|
result.push(inputStream.readBytes(available));
|
||||||
}
|
}
|
||||||
|
|
||||||
return result.join('');
|
return result.join("");
|
||||||
}
|
}
|
||||||
|
|
||||||
function now() {
|
function now() {
|
||||||
@@ -68,7 +69,9 @@ async function handleRequest(request, response) {
|
|||||||
message = "bad";
|
message = "bad";
|
||||||
} else {
|
} else {
|
||||||
log("Read POST body");
|
log("Read POST body");
|
||||||
let body = new URLSearchParams(readStream(new BinaryInputStream(request.bodyInputStream)));
|
let body = new URLSearchParams(
|
||||||
|
readStream(new BinaryInputStream(request.bodyInputStream))
|
||||||
|
);
|
||||||
message = body.get("token") || "bad";
|
message = body.get("token") || "bad";
|
||||||
log(`The result was ${message}`);
|
log(`The result was ${message}`);
|
||||||
}
|
}
|
||||||
@@ -81,17 +84,21 @@ async function handleRequest(request, response) {
|
|||||||
let header = "<!doctype html><!-- ";
|
let header = "<!doctype html><!-- ";
|
||||||
let footer = ` --><script>"use strict"; let target = (opener || parent); target.postMessage('${message}', '*');</script>`;
|
let footer = ` --><script>"use strict"; let target = (opener || parent); target.postMessage('${message}', '*');</script>`;
|
||||||
|
|
||||||
log("Set headers")
|
log("Set headers");
|
||||||
response.setHeader("Content-Type", "text/html", false);
|
response.setHeader("Content-Type", "text/html", false);
|
||||||
response.setHeader("Content-Length", `${size + header.length + footer.length}`, false);
|
response.setHeader(
|
||||||
|
"Content-Length",
|
||||||
|
`${size + header.length + footer.length}`,
|
||||||
|
false
|
||||||
|
);
|
||||||
response.setStatusLine(request.httpVersion, "200", "OK");
|
response.setStatusLine(request.httpVersion, "200", "OK");
|
||||||
|
|
||||||
response.processAsync();
|
response.processAsync();
|
||||||
log("Write header");
|
log("Write header");
|
||||||
response.write(header);
|
response.write(header);
|
||||||
log("Write body")
|
log("Write body");
|
||||||
for (let data of generateBody(fragments, size)) {
|
for (let data of generateBody(fragments, size)) {
|
||||||
delay = Math.max(0, delayUntil - now())
|
delay = Math.max(0, delayUntil - now());
|
||||||
log(`Delay sending fragment for ${delay / fragments}`);
|
log(`Delay sending fragment for ${delay / fragments}`);
|
||||||
let failed = false;
|
let failed = false;
|
||||||
await new Promise(resolve => {
|
await new Promise(resolve => {
|
||||||
@@ -112,10 +119,10 @@ async function handleRequest(request, response) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fragments = Math.max(--fragments, 1);
|
fragments = Math.max(--fragments, 1);
|
||||||
log(`Fragments left ${fragments}`)
|
log(`Fragments left ${fragments}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
log("Write footer")
|
log("Write footer");
|
||||||
response.write(footer);
|
response.write(footer);
|
||||||
|
|
||||||
response.finish();
|
response.finish();
|
||||||
|
|||||||
@@ -1,10 +1,17 @@
|
|||||||
jsURL = "javascript:" + escape('window.parent.postMessage("JS uri ran", "*");\
|
jsURL =
|
||||||
|
"javascript:" +
|
||||||
|
escape(
|
||||||
|
'window.parent.postMessage("JS uri ran", "*");\
|
||||||
return \'\
|
return \'\
|
||||||
<script>\
|
<script>\
|
||||||
window.parent.postMessage("Able to access private: " +\
|
window.parent.postMessage("Able to access private: " +\
|
||||||
window.parent.private, "*");\
|
window.parent.private, "*");\
|
||||||
</script>\'');
|
</script>\''
|
||||||
dataURL = "data:text/html," + escape('<!DOCTYPE HTML>\
|
);
|
||||||
|
dataURL =
|
||||||
|
"data:text/html," +
|
||||||
|
escape(
|
||||||
|
'<!DOCTYPE HTML>\
|
||||||
<script>\
|
<script>\
|
||||||
try {\
|
try {\
|
||||||
window.parent.postMessage("Able to access private: " +\
|
window.parent.postMessage("Able to access private: " +\
|
||||||
@@ -13,7 +20,8 @@ try {\
|
|||||||
catch (e) {\
|
catch (e) {\
|
||||||
window.parent.postMessage("pass", "*");\
|
window.parent.postMessage("pass", "*");\
|
||||||
}\
|
}\
|
||||||
</script>');
|
</script>'
|
||||||
|
);
|
||||||
|
|
||||||
tests = [
|
tests = [
|
||||||
// Plain document should work as normal
|
// Plain document should work as normal
|
||||||
@@ -29,8 +37,7 @@ catch (e) {\
|
|||||||
</script>',
|
</script>',
|
||||||
|
|
||||||
// refresh to plain doc
|
// refresh to plain doc
|
||||||
{ refresh: "file_bug475636.sjs?1",
|
{ refresh: "file_bug475636.sjs?1", doc: "<!DOCTYPE HTML>" },
|
||||||
doc: '<!DOCTYPE HTML>' },
|
|
||||||
|
|
||||||
// meta-refresh to plain doc
|
// meta-refresh to plain doc
|
||||||
'<!DOCTYPE HTML>\
|
'<!DOCTYPE HTML>\
|
||||||
@@ -39,51 +46,52 @@ catch (e) {\
|
|||||||
</head>',
|
</head>',
|
||||||
|
|
||||||
// refresh to data url
|
// refresh to data url
|
||||||
{ refresh: dataURL,
|
{ refresh: dataURL, doc: "<!DOCTYPE HTML>" },
|
||||||
doc: '<!DOCTYPE HTML>' },
|
|
||||||
|
|
||||||
// meta-refresh to data url
|
// meta-refresh to data url
|
||||||
'<!DOCTYPE HTML>\
|
'<!DOCTYPE HTML>\
|
||||||
<head>\
|
<head>\
|
||||||
<meta http-equiv="refresh" content="0; url=' + dataURL + '">\
|
<meta http-equiv="refresh" content="0; url=' +
|
||||||
|
dataURL +
|
||||||
|
'">\
|
||||||
</head>',
|
</head>',
|
||||||
|
|
||||||
// refresh to js url should not be followed
|
// refresh to js url should not be followed
|
||||||
{ refresh: jsURL,
|
{
|
||||||
|
refresh: jsURL,
|
||||||
doc:
|
doc:
|
||||||
'<!DOCTYPE HTML>\
|
'<!DOCTYPE HTML>\
|
||||||
<script>\
|
<script>\
|
||||||
setTimeout(function() {\
|
setTimeout(function() {\
|
||||||
window.parent.postMessage("pass", "*");\
|
window.parent.postMessage("pass", "*");\
|
||||||
}, 2000);\
|
}, 2000);\
|
||||||
</script>' },
|
</script>',
|
||||||
|
},
|
||||||
|
|
||||||
// meta refresh to js url should not be followed
|
// meta refresh to js url should not be followed
|
||||||
'<!DOCTYPE HTML>\
|
'<!DOCTYPE HTML>\
|
||||||
<head>\
|
<head>\
|
||||||
<meta http-equiv="refresh" content="0; url=' + jsURL + '">\
|
<meta http-equiv="refresh" content="0; url=' +
|
||||||
|
jsURL +
|
||||||
|
'">\
|
||||||
</head>\
|
</head>\
|
||||||
<script>\
|
<script>\
|
||||||
setTimeout(function() {\
|
setTimeout(function() {\
|
||||||
window.parent.postMessage("pass", "*");\
|
window.parent.postMessage("pass", "*");\
|
||||||
}, 2000);\
|
}, 2000);\
|
||||||
</script>'
|
</script>',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
function handleRequest(request, response) {
|
||||||
function handleRequest(request, response)
|
|
||||||
{
|
|
||||||
dump("@@@@@@@@@hi there: " + request.queryString + "\n");
|
dump("@@@@@@@@@hi there: " + request.queryString + "\n");
|
||||||
test = tests[parseInt(request.queryString, 10) - 1];
|
test = tests[parseInt(request.queryString, 10) - 1];
|
||||||
response.setHeader("Content-Type", "text/html");
|
response.setHeader("Content-Type", "text/html");
|
||||||
|
|
||||||
if (!test) {
|
if (!test) {
|
||||||
response.write('<script>parent.postMessage("done", "*");</script>');
|
response.write('<script>parent.postMessage("done", "*");</script>');
|
||||||
}
|
} else if (typeof test == "string") {
|
||||||
else if (typeof test == "string") {
|
|
||||||
response.write(test);
|
response.write(test);
|
||||||
}
|
} else if (test.refresh) {
|
||||||
else if (test.refresh) {
|
|
||||||
response.setHeader("Refresh", "0; url=" + test.refresh);
|
response.setHeader("Refresh", "0; url=" + test.refresh);
|
||||||
response.write(test.doc);
|
response.write(test.doc);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
response.setHeader("Content-Type", "text/html", false);
|
response.setHeader("Content-Type", "text/html", false);
|
||||||
response.write('<html><body onload=\'parent.page2Load("' + request.method + '")\'>file_bug580069_2.sjs</body></html>');
|
response.write(
|
||||||
|
"<html><body onload='parent.page2Load(\"" +
|
||||||
|
request.method +
|
||||||
|
"\")'>file_bug580069_2.sjs</body></html>"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,17 @@
|
|||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
var count = parseInt(getState("count"));
|
||||||
var count = parseInt(getState('count'));
|
if (!count || request.queryString == "countreset") {
|
||||||
if (!count || request.queryString == 'countreset')
|
|
||||||
count = 0;
|
count = 0;
|
||||||
|
}
|
||||||
setState('count', count + 1 + '');
|
|
||||||
|
setState("count", count + 1 + "");
|
||||||
response.setHeader('Content-Type', 'text/html', false);
|
|
||||||
response.setHeader('Cache-Control', 'max-age=0');
|
response.setHeader("Content-Type", "text/html", false);
|
||||||
response.write('<html><body onload="opener.onChildLoad()" ' +
|
response.setHeader("Cache-Control", "max-age=0");
|
||||||
'onunload="parseInt(\'0\')">' +
|
response.write(
|
||||||
count + '</body></html>');
|
'<html><body onload="opener.onChildLoad()" ' +
|
||||||
|
"onunload=\"parseInt('0')\">" +
|
||||||
|
count +
|
||||||
|
"</body></html>"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
Cu.import("resource://gre/modules/Timer.jsm");
|
|
||||||
|
|
||||||
const CC = Components.Constructor;
|
const CC = Components.Constructor;
|
||||||
const BinaryInputStream = CC(
|
const BinaryInputStream = CC(
|
||||||
"@mozilla.org/binaryinputstream;1",
|
"@mozilla.org/binaryinputstream;1",
|
||||||
@@ -23,7 +21,7 @@ async function handleRequest(request, response) {
|
|||||||
if (request.method !== "POST") {
|
if (request.method !== "POST") {
|
||||||
message = "bad";
|
message = "bad";
|
||||||
} else {
|
} else {
|
||||||
log("Reading request")
|
log("Reading request");
|
||||||
let available = 0;
|
let available = 0;
|
||||||
let inputStream = new BinaryInputStream(request.bodyInputStream);
|
let inputStream = new BinaryInputStream(request.bodyInputStream);
|
||||||
while ((available = inputStream.available()) > 0) {
|
while ((available = inputStream.available()) > 0) {
|
||||||
@@ -31,10 +29,12 @@ async function handleRequest(request, response) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
log("Setting Headers")
|
log("Setting Headers");
|
||||||
response.setHeader("Content-Type", "text/html", false);
|
response.setHeader("Content-Type", "text/html", false);
|
||||||
response.setStatusLine(request.httpVersion, "200", "OK");
|
response.setStatusLine(request.httpVersion, "200", "OK");
|
||||||
log("Writing body");
|
log("Writing body");
|
||||||
response.write('<script>"use strict"; let target = opener ? opener : parent; target.postMessage("done", "*");</script>');
|
response.write(
|
||||||
log("Done")
|
'<script>"use strict"; let target = opener ? opener : parent; target.postMessage("done", "*");</script>'
|
||||||
|
);
|
||||||
|
log("Done");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ function handleRequest(request, response) {
|
|||||||
response.setHeader("Cache-Control", "no-cache", false);
|
response.setHeader("Cache-Control", "no-cache", false);
|
||||||
// Wait a bit.
|
// Wait a bit.
|
||||||
var s = Date.now();
|
var s = Date.now();
|
||||||
while (Date.now() - s < 1000);
|
while (Date.now() - s < 1000) {}
|
||||||
|
|
||||||
response.write(`<!DOCTYPE HTML>
|
response.write(`<!DOCTYPE HTML>
|
||||||
<html>
|
<html>
|
||||||
|
|||||||
@@ -20,7 +20,10 @@ function handleRequest(request, response) {
|
|||||||
setState("sessionhistory_do_redirect", "");
|
setState("sessionhistory_do_redirect", "");
|
||||||
|
|
||||||
response.setStatusLine("1.1", 302, "Found");
|
response.setStatusLine("1.1", 302, "Found");
|
||||||
response.setHeader("Location",
|
response.setHeader(
|
||||||
"file_session_history_on_redirect_2.html", false);
|
"Location",
|
||||||
|
"file_session_history_on_redirect_2.html",
|
||||||
|
false
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,16 @@
|
|||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
response.processAsync();
|
response.processAsync();
|
||||||
|
|
||||||
timer = Components.classes["@mozilla.org/timer;1"].
|
timer = Components.classes["@mozilla.org/timer;1"].createInstance(
|
||||||
createInstance(Components.interfaces.nsITimer);
|
Components.interfaces.nsITimer
|
||||||
timer.init(function() {
|
);
|
||||||
|
timer.init(
|
||||||
|
function() {
|
||||||
response.finish();
|
response.finish();
|
||||||
}, 5000, Components.interfaces.nsITimer.TYPE_ONE_SHOT);
|
},
|
||||||
|
5000,
|
||||||
|
Components.interfaces.nsITimer.TYPE_ONE_SHOT
|
||||||
|
);
|
||||||
|
|
||||||
response.setStatusLine(null, 200, "OK");
|
response.setStatusLine(null, 200, "OK");
|
||||||
response.setHeader("Content-Type", "text/plain", false);
|
response.setHeader("Content-Type", "text/plain", false);
|
||||||
|
|||||||
@@ -1,11 +1,15 @@
|
|||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
response.processAsync();
|
response.processAsync();
|
||||||
|
|
||||||
timer = Components.classes["@mozilla.org/timer;1"].
|
timer = Components.classes["@mozilla.org/timer;1"].createInstance(
|
||||||
createInstance(Components.interfaces.nsITimer);
|
Components.interfaces.nsITimer
|
||||||
timer.init(function() {
|
);
|
||||||
|
timer.init(
|
||||||
|
function() {
|
||||||
response.write("Here the content. But slowly.");
|
response.write("Here the content. But slowly.");
|
||||||
response.finish();
|
response.finish();
|
||||||
}, 1000, Components.interfaces.nsITimer.TYPE_ONE_SHOT);
|
},
|
||||||
|
1000,
|
||||||
|
Components.interfaces.nsITimer.TYPE_ONE_SHOT
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
response.setStatusLine("1.1", 500, "Internal Server Error");
|
response.setStatusLine("1.1", 500, "Internal Server Error");
|
||||||
response.setHeader("Content-Type", "image/svg+xml", false);
|
response.setHeader("Content-Type", "image/svg+xml", false);
|
||||||
|
|
||||||
let body = "<svg xmlns='http://www.w3.org/2000/svg' width='70' height='0'></svg>";
|
let body =
|
||||||
|
"<svg xmlns='http://www.w3.org/2000/svg' width='70' height='0'></svg>";
|
||||||
response.bodyOutputStream.write(body, body.length);
|
response.bodyOutputStream.write(body, body.length);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
response.setStatusLine(null, 401, "Unauthorized");
|
response.setStatusLine(null, 401, "Unauthorized");
|
||||||
|
|
||||||
response.setHeader("WWW-Authenticate", "basic realm=\"restricted\"", false);
|
response.setHeader("WWW-Authenticate", 'basic realm="restricted"', false);
|
||||||
|
|
||||||
response.setHeader("Access-Control-Allow-Origin", "*", false);
|
response.setHeader("Access-Control-Allow-Origin", "*", false);
|
||||||
response.setHeader("Access-Control-Allow-Credentials", "true", false);
|
response.setHeader("Access-Control-Allow-Credentials", "true", false);
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
const CC = Components.Constructor;
|
const CC = Components.Constructor;
|
||||||
const BinaryInputStream = CC("@mozilla.org/binaryinputstream;1",
|
const BinaryInputStream = CC(
|
||||||
|
"@mozilla.org/binaryinputstream;1",
|
||||||
"nsIBinaryInputStream",
|
"nsIBinaryInputStream",
|
||||||
"setInputStream");
|
"setInputStream"
|
||||||
|
);
|
||||||
|
|
||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
response.setHeader("Content-Type", "text/plain", false);
|
response.setHeader("Content-Type", "text/plain", false);
|
||||||
if (request.method == "GET") {
|
if (request.method == "GET") {
|
||||||
response.write(request.queryString);
|
response.write(request.queryString);
|
||||||
@@ -14,11 +15,11 @@ function handleRequest(request, response)
|
|||||||
var avail;
|
var avail;
|
||||||
var bytes = [];
|
var bytes = [];
|
||||||
|
|
||||||
while ((avail = body.available()) > 0)
|
while ((avail = body.available()) > 0) {
|
||||||
Array.prototype.push.apply(bytes, body.readByteArray(avail));
|
Array.prototype.push.apply(bytes, body.readByteArray(avail));
|
||||||
|
}
|
||||||
|
|
||||||
var data = String.fromCharCode.apply(null, bytes);
|
var data = String.fromCharCode.apply(null, bytes);
|
||||||
response.bodyOutputStream.write(data, data.length);
|
response.bodyOutputStream.write(data, data.length);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
response.setStatusLine(null, 302, "Moved");
|
response.setStatusLine(null, 302, "Moved");
|
||||||
response.setHeader("Location", "http://nosuchdomain.localhost", false);
|
response.setHeader("Location", "http://nosuchdomain.localhost", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,20 +1,21 @@
|
|||||||
const CC = Components.Constructor;
|
const CC = Components.Constructor;
|
||||||
const BinaryInputStream = CC("@mozilla.org/binaryinputstream;1",
|
const BinaryInputStream = CC(
|
||||||
|
"@mozilla.org/binaryinputstream;1",
|
||||||
"nsIBinaryInputStream",
|
"nsIBinaryInputStream",
|
||||||
"setInputStream");
|
"setInputStream"
|
||||||
|
);
|
||||||
|
|
||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
response.setHeader("Content-Type", "text/plain", false);
|
response.setHeader("Content-Type", "text/plain", false);
|
||||||
|
|
||||||
var body = new BinaryInputStream(request.bodyInputStream);
|
var body = new BinaryInputStream(request.bodyInputStream);
|
||||||
|
|
||||||
var avail;
|
var avail;
|
||||||
var bytes = [];
|
var bytes = [];
|
||||||
while ((avail = body.available()) > 0)
|
while ((avail = body.available()) > 0) {
|
||||||
Array.prototype.push.apply(bytes, body.readByteArray(avail));
|
Array.prototype.push.apply(bytes, body.readByteArray(avail));
|
||||||
|
}
|
||||||
|
|
||||||
var data = String.fromCharCode.apply(null, bytes);
|
var data = String.fromCharCode.apply(null, bytes);
|
||||||
response.bodyOutputStream.write(data, data.length);
|
response.bodyOutputStream.write(data, data.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
response.setHeader("Content-Type", "text/plain; charset=ISO-8859-1", false);
|
response.setHeader("Content-Type", "text/plain; charset=ISO-8859-1", false);
|
||||||
const body = [0xC1];
|
const body = [0xc1];
|
||||||
var bos = Components.classes["@mozilla.org/binaryoutputstream;1"]
|
var bos = Components.classes[
|
||||||
.createInstance(Components.interfaces.nsIBinaryOutputStream);
|
"@mozilla.org/binaryoutputstream;1"
|
||||||
|
].createInstance(Components.interfaces.nsIBinaryOutputStream);
|
||||||
bos.setOutputStream(response.bodyOutputStream);
|
bos.setOutputStream(response.bodyOutputStream);
|
||||||
|
|
||||||
bos.writeByteArray(body);
|
bos.writeByteArray(body);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
response.setStatusLine(null, 302, "Found");
|
response.setStatusLine(null, 302, "Found");
|
||||||
response.setHeader("Location", "http://example.com/tests/dom/base/test/bug461735-post-redirect.js", false);
|
response.setHeader(
|
||||||
|
"Location",
|
||||||
|
"http://example.com/tests/dom/base/test/bug461735-post-redirect.js",
|
||||||
|
false
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
response.setStatusLine(null, 302, "Found");
|
response.setStatusLine(null, 302, "Found");
|
||||||
response.setHeader("Location", "http://mochi.test:8888/tests/dom/base/test/bug461735-post-redirect.js", false);
|
response.setHeader(
|
||||||
|
"Location",
|
||||||
|
"http://mochi.test:8888/tests/dom/base/test/bug461735-post-redirect.js",
|
||||||
|
false
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,11 @@
|
|||||||
|
function handleRequest(request, response) {
|
||||||
function handleRequest(request, response)
|
|
||||||
{
|
|
||||||
var body = "loaded";
|
var body = "loaded";
|
||||||
var origin = "localhost";
|
var origin = "localhost";
|
||||||
try {
|
try {
|
||||||
var origin = request.getHeader("Origin");
|
var origin = request.getHeader("Origin");
|
||||||
} catch (e) {}
|
} catch (e) {}
|
||||||
|
|
||||||
response.setHeader("Access-Control-Allow-Origin",
|
response.setHeader("Access-Control-Allow-Origin", origin, false);
|
||||||
origin,
|
|
||||||
false);
|
|
||||||
response.setHeader("Access-Control-Allow-Credentials", "true", false);
|
response.setHeader("Access-Control-Allow-Credentials", "true", false);
|
||||||
response.setHeader("Access-Control-Allow-Methods", "XMETHOD", false);
|
response.setHeader("Access-Control-Allow-Methods", "XMETHOD", false);
|
||||||
response.setHeader("Connection", "Keep-alive", false);
|
response.setHeader("Connection", "Keep-alive", false);
|
||||||
|
|||||||
@@ -1,26 +1,22 @@
|
|||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
if (request.queryString == "") {
|
||||||
if (request.queryString == "")
|
var etag = request.hasHeader("If-Match")
|
||||||
{
|
? request.getHeader("If-Match")
|
||||||
var etag = request.hasHeader("If-Match") ? request.getHeader("If-Match") : null;
|
: null;
|
||||||
if (!etag || etag == getState("etag"))
|
if (!etag || etag == getState("etag")) {
|
||||||
{
|
|
||||||
response.setStatusLine(request.httpVersion, 200, "Ok");
|
response.setStatusLine(request.httpVersion, 200, "Ok");
|
||||||
response.setHeader("Content-Type", "text/html");
|
response.setHeader("Content-Type", "text/html");
|
||||||
response.setHeader("ETag", getState("etag"));
|
response.setHeader("ETag", getState("etag"));
|
||||||
response.setHeader("Cache-control", "max-age=36000");
|
response.setHeader("Cache-control", "max-age=36000");
|
||||||
response.write(getState("etag"));
|
response.write(getState("etag"));
|
||||||
}
|
} else if (etag) {
|
||||||
else if (etag)
|
|
||||||
{
|
|
||||||
response.setStatusLine(request.httpVersion, 412, "Precondition Failed");
|
response.setStatusLine(request.httpVersion, 412, "Precondition Failed");
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
var etag = request.queryString.match(/^etag=(.*)$/);
|
var etag = request.queryString.match(/^etag=(.*)$/);
|
||||||
if (etag)
|
if (etag) {
|
||||||
setState("etag", etag[1]);
|
setState("etag", etag[1]);
|
||||||
|
}
|
||||||
|
|
||||||
response.setStatusLine(request.httpVersion, 204, "No content");
|
response.setStatusLine(request.httpVersion, 204, "No content");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,18 +1,20 @@
|
|||||||
const CC = Components.Constructor;
|
const CC = Components.Constructor;
|
||||||
const BinaryInputStream = CC("@mozilla.org/binaryinputstream;1",
|
const BinaryInputStream = CC(
|
||||||
|
"@mozilla.org/binaryinputstream;1",
|
||||||
"nsIBinaryInputStream",
|
"nsIBinaryInputStream",
|
||||||
"setInputStream");
|
"setInputStream"
|
||||||
|
);
|
||||||
|
|
||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
response.setHeader("Content-Type", "text/plain", false);
|
response.setHeader("Content-Type", "text/plain", false);
|
||||||
|
|
||||||
var body = new BinaryInputStream(request.bodyInputStream);
|
var body = new BinaryInputStream(request.bodyInputStream);
|
||||||
|
|
||||||
var avail;
|
var avail;
|
||||||
var bytes = [];
|
var bytes = [];
|
||||||
while ((avail = body.available()) > 0)
|
while ((avail = body.available()) > 0) {
|
||||||
Array.prototype.push.apply(bytes, body.readByteArray(avail));
|
Array.prototype.push.apply(bytes, body.readByteArray(avail));
|
||||||
|
}
|
||||||
|
|
||||||
var data = String.fromCharCode.apply(null, bytes);
|
var data = String.fromCharCode.apply(null, bytes);
|
||||||
response.bodyOutputStream.write(data, data.length);
|
response.bodyOutputStream.write(data, data.length);
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
function getInputStream(path)
|
function getInputStream(path) {
|
||||||
{
|
var file = Components.classes["@mozilla.org/file/directory_service;1"]
|
||||||
var file = Components.classes["@mozilla.org/file/directory_service;1"].
|
.getService(Components.interfaces.nsIProperties)
|
||||||
getService(Components.interfaces.nsIProperties).
|
.get("CurWorkD", Components.interfaces.nsIFile);
|
||||||
get("CurWorkD", Components.interfaces.nsIFile);
|
var fis = Components.classes[
|
||||||
var fis = Components.classes['@mozilla.org/network/file-input-stream;1'].
|
"@mozilla.org/network/file-input-stream;1"
|
||||||
createInstance(Components.interfaces.nsIFileInputStream);
|
].createInstance(Components.interfaces.nsIFileInputStream);
|
||||||
var split = path.split("/");
|
var split = path.split("/");
|
||||||
for (var i = 0; i < split.length; ++i) {
|
for (var i = 0; i < split.length; ++i) {
|
||||||
file.append(split[i]);
|
file.append(split[i]);
|
||||||
@@ -13,14 +13,12 @@ function getInputStream(path)
|
|||||||
return fis;
|
return fis;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function handleRequest(request, response) {
|
||||||
|
var inputStream = getInputStream(
|
||||||
function handleRequest(request, response)
|
"tests/dom/base/test/bug638112-response.txt"
|
||||||
{
|
);
|
||||||
var inputStream = getInputStream("tests/dom/base/test/bug638112-response.txt")
|
|
||||||
response.seizePower();
|
response.seizePower();
|
||||||
response.bodyOutputStream.writeFrom(inputStream,
|
response.bodyOutputStream.writeFrom(inputStream, inputStream.available());
|
||||||
inputStream.available());
|
|
||||||
response.finish();
|
response.finish();
|
||||||
inputStream.close();
|
inputStream.close();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +1,46 @@
|
|||||||
var BASE_URL = 'example.com/tests/dom/base/test/bug704320.sjs';
|
var BASE_URL = "example.com/tests/dom/base/test/bug704320.sjs";
|
||||||
|
|
||||||
function createTestUrl(schemeFrom, schemeTo, policy, action, type) {
|
function createTestUrl(schemeFrom, schemeTo, policy, action, type) {
|
||||||
return schemeTo + '://' + BASE_URL + '?' +
|
return (
|
||||||
'action=' + action + '&' +
|
schemeTo +
|
||||||
'scheme=' + schemeFrom + '-to-' + schemeTo + '&' +
|
"://" +
|
||||||
'policy=' + policy + '&' +
|
BASE_URL +
|
||||||
'type=' + type;
|
"?" +
|
||||||
|
"action=" +
|
||||||
|
action +
|
||||||
|
"&" +
|
||||||
|
"scheme=" +
|
||||||
|
schemeFrom +
|
||||||
|
"-to-" +
|
||||||
|
schemeTo +
|
||||||
|
"&" +
|
||||||
|
"policy=" +
|
||||||
|
policy +
|
||||||
|
"&" +
|
||||||
|
"type=" +
|
||||||
|
type
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function create2ndLevelIframeUrl(schemeFrom, schemeTo, policy, type) {
|
function create2ndLevelIframeUrl(schemeFrom, schemeTo, policy, type) {
|
||||||
return schemeFrom + '://' + BASE_URL + '?' +
|
return (
|
||||||
'action=create-2nd-level-iframe&' +
|
schemeFrom +
|
||||||
'scheme-from=' + schemeFrom + '&' +
|
"://" +
|
||||||
'scheme-to=' + schemeTo + '&' +
|
BASE_URL +
|
||||||
'policy=' + policy + '&' +
|
"?" +
|
||||||
'type=' + type;
|
"action=create-2nd-level-iframe&" +
|
||||||
|
"scheme-from=" +
|
||||||
|
schemeFrom +
|
||||||
|
"&" +
|
||||||
|
"scheme-to=" +
|
||||||
|
schemeTo +
|
||||||
|
"&" +
|
||||||
|
"policy=" +
|
||||||
|
policy +
|
||||||
|
"&" +
|
||||||
|
"type=" +
|
||||||
|
type
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Creates the following test cases for the specified scheme and referrer
|
// Creates the following test cases for the specified scheme and referrer
|
||||||
@@ -46,56 +72,102 @@ function create2ndLevelIframeUrl(schemeFrom, schemeTo, policy, type) {
|
|||||||
// results.
|
// results.
|
||||||
function createTest(schemeFrom, schemeTo, policy, optionalEarlierPolicy) {
|
function createTest(schemeFrom, schemeTo, policy, optionalEarlierPolicy) {
|
||||||
var _createTestUrl = createTestUrl.bind(
|
var _createTestUrl = createTestUrl.bind(
|
||||||
null, schemeFrom, schemeTo, policy, 'test');
|
null,
|
||||||
|
schemeFrom,
|
||||||
|
schemeTo,
|
||||||
|
policy,
|
||||||
|
"test"
|
||||||
|
);
|
||||||
|
|
||||||
var _create2ndLevelIframeUrl = create2ndLevelIframeUrl.bind(
|
var _create2ndLevelIframeUrl = create2ndLevelIframeUrl.bind(
|
||||||
null, schemeFrom, schemeTo, policy);
|
null,
|
||||||
|
schemeFrom,
|
||||||
|
schemeTo,
|
||||||
|
policy
|
||||||
|
);
|
||||||
|
|
||||||
var metaReferrerPolicyString = '';
|
var metaReferrerPolicyString = "";
|
||||||
if (optionalEarlierPolicy && optionalEarlierPolicy != '') {
|
if (optionalEarlierPolicy && optionalEarlierPolicy != "") {
|
||||||
metaReferrerPolicyString += '<meta name="referrer" content="' + optionalEarlierPolicy + '">\n';
|
metaReferrerPolicyString +=
|
||||||
|
'<meta name="referrer" content="' + optionalEarlierPolicy + '">\n';
|
||||||
}
|
}
|
||||||
metaReferrerPolicyString += '<meta name="referrer" content="' + policy + '">';
|
metaReferrerPolicyString += '<meta name="referrer" content="' + policy + '">';
|
||||||
|
|
||||||
return '<!DOCTYPE HTML>\n\
|
return (
|
||||||
|
"<!DOCTYPE HTML>\n\
|
||||||
<html>\n\
|
<html>\n\
|
||||||
<head>\n\
|
<head>\n\
|
||||||
'+metaReferrerPolicyString+'\n\
|
" +
|
||||||
<link rel="stylesheet" type="text/css" href="' + _createTestUrl('stylesheet') + '">\n\
|
metaReferrerPolicyString +
|
||||||
|
'\n\
|
||||||
|
<link rel="stylesheet" type="text/css" href="' +
|
||||||
|
_createTestUrl("stylesheet") +
|
||||||
|
'">\n\
|
||||||
<style type="text/css">\n\
|
<style type="text/css">\n\
|
||||||
@import "' + _createTestUrl('import-css') + '";\n\
|
@import "' +
|
||||||
|
_createTestUrl("import-css") +
|
||||||
|
'";\n\
|
||||||
@font-face {\n\
|
@font-face {\n\
|
||||||
font-family: "Fake Serif Bold";\n\
|
font-family: "Fake Serif Bold";\n\
|
||||||
src: url("' + _createTestUrl('font-face') + '");\n\
|
src: url("' +
|
||||||
|
_createTestUrl("font-face") +
|
||||||
|
'");\n\
|
||||||
}\n\
|
}\n\
|
||||||
body {\n\
|
body {\n\
|
||||||
font-family: "Fake Serif Bold", serif;\n\
|
font-family: "Fake Serif Bold", serif;\n\
|
||||||
background: url("' + _createTestUrl('bg-url') + '");\n\
|
background: url("' +
|
||||||
|
_createTestUrl("bg-url") +
|
||||||
|
'");\n\
|
||||||
}\n\
|
}\n\
|
||||||
</style>\n\
|
</style>\n\
|
||||||
</head>\n\
|
</head>\n\
|
||||||
<body>\n\
|
<body>\n\
|
||||||
<script src="' + _createTestUrl('script') + '"></script>\n\
|
<script src="' +
|
||||||
<img src="' + _createTestUrl('img') + '"></img>\n\
|
_createTestUrl("script") +
|
||||||
<iframe src="' + _createTestUrl('iframe') + '"></iframe>\n\
|
'"></script>\n\
|
||||||
<audio src="' + _createTestUrl('audio') + '"></audio>\n\
|
<img src="' +
|
||||||
<video src="' + _createTestUrl('video') + '"></video>\n\
|
_createTestUrl("img") +
|
||||||
<object type="bogus" data="' + _createTestUrl('object') + '"></object>\n\
|
'"></img>\n\
|
||||||
<object type="image/svg+xml" data="' + _createTestUrl('object-svg') + '"></object>\n\
|
<iframe src="' +
|
||||||
<a id="link" href="' + _createTestUrl('link') + '" ping="' + _createTestUrl('link-ping') + '"></a>\n\
|
_createTestUrl("iframe") +
|
||||||
<iframe src="' + _create2ndLevelIframeUrl('form') + '"></iframe>\n\
|
'"></iframe>\n\
|
||||||
<iframe src="' + _create2ndLevelIframeUrl('window.location') + '"></iframe>\n\
|
<audio src="' +
|
||||||
|
_createTestUrl("audio") +
|
||||||
|
'"></audio>\n\
|
||||||
|
<video src="' +
|
||||||
|
_createTestUrl("video") +
|
||||||
|
'"></video>\n\
|
||||||
|
<object type="bogus" data="' +
|
||||||
|
_createTestUrl("object") +
|
||||||
|
'"></object>\n\
|
||||||
|
<object type="image/svg+xml" data="' +
|
||||||
|
_createTestUrl("object-svg") +
|
||||||
|
'"></object>\n\
|
||||||
|
<a id="link" href="' +
|
||||||
|
_createTestUrl("link") +
|
||||||
|
'" ping="' +
|
||||||
|
_createTestUrl("link-ping") +
|
||||||
|
'"></a>\n\
|
||||||
|
<iframe src="' +
|
||||||
|
_create2ndLevelIframeUrl("form") +
|
||||||
|
'"></iframe>\n\
|
||||||
|
<iframe src="' +
|
||||||
|
_create2ndLevelIframeUrl("window.location") +
|
||||||
|
'"></iframe>\n\
|
||||||
<script>\n\
|
<script>\n\
|
||||||
var _testFinished = 0\n\
|
var _testFinished = 0\n\
|
||||||
(function() {\n\
|
(function() {\n\
|
||||||
var x = new XMLHttpRequest();\n\
|
var x = new XMLHttpRequest();\n\
|
||||||
x.open("GET", "' + _createTestUrl('xmlhttprequest') + '");\n\
|
x.open("GET", "' +
|
||||||
|
_createTestUrl("xmlhttprequest") +
|
||||||
|
'");\n\
|
||||||
x.send();\n\
|
x.send();\n\
|
||||||
})();\n\
|
})();\n\
|
||||||
(function() {\n\
|
(function() {\n\
|
||||||
var eventSource = new EventSource("' + _createTestUrl('eventsource') + '");\n\
|
var eventSource = new EventSource("' +
|
||||||
|
_createTestUrl("eventsource") +
|
||||||
|
'");\n\
|
||||||
})();' +
|
})();' +
|
||||||
|
|
||||||
// LOAD EVENT (most of the tests)
|
// LOAD EVENT (most of the tests)
|
||||||
// fires when the resources for the page are loaded
|
// fires when the resources for the page are loaded
|
||||||
'var _isLoaded = false;\n\
|
'var _isLoaded = false;\n\
|
||||||
@@ -103,7 +175,6 @@ function createTest(schemeFrom, schemeTo, policy, optionalEarlierPolicy) {
|
|||||||
this._isLoaded = true;\n\
|
this._isLoaded = true;\n\
|
||||||
this.checkForFinish();\n\
|
this.checkForFinish();\n\
|
||||||
}.bind(window), false);' +
|
}.bind(window), false);' +
|
||||||
|
|
||||||
// WINDOW.OPEN test
|
// WINDOW.OPEN test
|
||||||
// listen for incoming status from window.open, close the window
|
// listen for incoming status from window.open, close the window
|
||||||
// and check if we're done.
|
// and check if we're done.
|
||||||
@@ -115,8 +186,9 @@ function createTest(schemeFrom, schemeTo, policy, optionalEarlierPolicy) {
|
|||||||
this.checkForFinish();\n\
|
this.checkForFinish();\n\
|
||||||
}\n\
|
}\n\
|
||||||
}.bind(window), false);\n\
|
}.bind(window), false);\n\
|
||||||
var win = window.open("' + _createTestUrl('window.open') + '", "");' +
|
var win = window.open("' +
|
||||||
|
_createTestUrl("window.open") +
|
||||||
|
'", "");' +
|
||||||
// called by the two things that must complete: window.open page
|
// called by the two things that must complete: window.open page
|
||||||
// and the window load event. When both are complete, this
|
// and the window load event. When both are complete, this
|
||||||
// "finishes" the iframe subtest by clicking the link.
|
// "finishes" the iframe subtest by clicking the link.
|
||||||
@@ -129,59 +201,87 @@ function createTest(schemeFrom, schemeTo, policy, optionalEarlierPolicy) {
|
|||||||
}\n\
|
}\n\
|
||||||
</script>\n\
|
</script>\n\
|
||||||
</body>\n\
|
</body>\n\
|
||||||
</html>';
|
</html>'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function createIframedFormTest(schemeFrom, schemeTo, policy) {
|
function createIframedFormTest(schemeFrom, schemeTo, policy) {
|
||||||
var actionUrl = schemeTo + '://' + BASE_URL;
|
var actionUrl = schemeTo + "://" + BASE_URL;
|
||||||
|
|
||||||
return '<!DOCTYPE HTML>\n\
|
return (
|
||||||
|
'<!DOCTYPE HTML>\n\
|
||||||
<html>\n\
|
<html>\n\
|
||||||
<head>\n\
|
<head>\n\
|
||||||
<meta name="referrer" content="' + policy + '">\n\
|
<meta name="referrer" content="' +
|
||||||
|
policy +
|
||||||
|
'">\n\
|
||||||
</head>\n\
|
</head>\n\
|
||||||
<body>\n\
|
<body>\n\
|
||||||
<form id="form" action="' + actionUrl + '">\n\
|
<form id="form" action="' +
|
||||||
|
actionUrl +
|
||||||
|
'">\n\
|
||||||
<input type="hidden" name="action" value="test">\n\
|
<input type="hidden" name="action" value="test">\n\
|
||||||
<input type="hidden" name="scheme" value="' + schemeFrom + '-to-' + schemeTo + '">\n\
|
<input type="hidden" name="scheme" value="' +
|
||||||
<input type="hidden" name="policy" value="' + policy + '">\n\
|
schemeFrom +
|
||||||
|
"-to-" +
|
||||||
|
schemeTo +
|
||||||
|
'">\n\
|
||||||
|
<input type="hidden" name="policy" value="' +
|
||||||
|
policy +
|
||||||
|
'">\n\
|
||||||
<input type="hidden" name="type" value="form">\n\
|
<input type="hidden" name="type" value="form">\n\
|
||||||
</form>\n\
|
</form>\n\
|
||||||
<script>\n\
|
<script>\n\
|
||||||
document.getElementById("form").submit();\n\
|
document.getElementById("form").submit();\n\
|
||||||
</script>\n\
|
</script>\n\
|
||||||
</body>\n\
|
</body>\n\
|
||||||
</html>';
|
</html>'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function createIframedWindowLocationTest(schemeFrom, schemeTo, policy) {
|
function createIframedWindowLocationTest(schemeFrom, schemeTo, policy) {
|
||||||
var url = createTestUrl(
|
var url = createTestUrl(
|
||||||
schemeFrom, schemeTo, policy, 'test', 'window.location');
|
schemeFrom,
|
||||||
|
schemeTo,
|
||||||
|
policy,
|
||||||
|
"test",
|
||||||
|
"window.location"
|
||||||
|
);
|
||||||
|
|
||||||
return '<!DOCTYPE HTML>\n\
|
return (
|
||||||
|
'<!DOCTYPE HTML>\n\
|
||||||
<html>\n\
|
<html>\n\
|
||||||
<head>\n\
|
<head>\n\
|
||||||
<meta name="referrer" content="' + policy + '">\n\
|
<meta name="referrer" content="' +
|
||||||
|
policy +
|
||||||
|
'">\n\
|
||||||
</head>\n\
|
</head>\n\
|
||||||
<body>\n\
|
<body>\n\
|
||||||
<script>\n\
|
<script>\n\
|
||||||
window.location = "' + url + '";\n\
|
window.location = "' +
|
||||||
|
url +
|
||||||
|
'";\n\
|
||||||
</script>\n\
|
</script>\n\
|
||||||
</body>\n\
|
</body>\n\
|
||||||
</html>';
|
</html>'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function createPolicyTest(policy, optionalEarlierPolicy) {
|
function createPolicyTest(policy, optionalEarlierPolicy) {
|
||||||
var metaReferrerPolicyString = '';
|
var metaReferrerPolicyString = "";
|
||||||
if (optionalEarlierPolicy && optionalEarlierPolicy != '') {
|
if (optionalEarlierPolicy && optionalEarlierPolicy != "") {
|
||||||
metaReferrerPolicyString += '<meta name="referrer" content="' + optionalEarlierPolicy + '">\n';
|
metaReferrerPolicyString +=
|
||||||
|
'<meta name="referrer" content="' + optionalEarlierPolicy + '">\n';
|
||||||
}
|
}
|
||||||
metaReferrerPolicyString += '<meta name="referrer" content="' + policy + '">';
|
metaReferrerPolicyString += '<meta name="referrer" content="' + policy + '">';
|
||||||
|
|
||||||
return '<!DOCTYPE HTML>\n\
|
return (
|
||||||
|
"<!DOCTYPE HTML>\n\
|
||||||
<html>\n\
|
<html>\n\
|
||||||
<head>\n\
|
<head>\n\
|
||||||
'+metaReferrerPolicyString+'\n\
|
" +
|
||||||
|
metaReferrerPolicyString +
|
||||||
|
'\n\
|
||||||
<script type="text/javascript" src="/tests/dom/base/test/file_bug704320_preload_common.js"></script>\n\
|
<script type="text/javascript" src="/tests/dom/base/test/file_bug704320_preload_common.js"></script>\n\
|
||||||
</head>\n\
|
</head>\n\
|
||||||
<body>\n\
|
<body>\n\
|
||||||
@@ -190,53 +290,55 @@ function createPolicyTest(policy, optionalEarlierPolicy) {
|
|||||||
<img src="http://example.com/tests/dom/base/test/bug704320_counter.sjs?type=img"\n\
|
<img src="http://example.com/tests/dom/base/test/bug704320_counter.sjs?type=img"\n\
|
||||||
onload="incrementLoad2(\'img\', 2);">\n\
|
onload="incrementLoad2(\'img\', 2);">\n\
|
||||||
</body>\n\
|
</body>\n\
|
||||||
</html>';
|
</html>'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
var sharedKey = 'bug704320.sjs';
|
var sharedKey = "bug704320.sjs";
|
||||||
var params = request.queryString.split('&');
|
var params = request.queryString.split("&");
|
||||||
var action = params[0].split('=')[1];
|
var action = params[0].split("=")[1];
|
||||||
|
|
||||||
if (action === 'create-1st-level-iframe') {
|
if (action === "create-1st-level-iframe") {
|
||||||
// ?action=create-1st-level-iframe&scheme-from=http&scheme-to=https&policy=origin
|
// ?action=create-1st-level-iframe&scheme-from=http&scheme-to=https&policy=origin
|
||||||
var schemeFrom = params[1].split('=')[1];
|
var schemeFrom = params[1].split("=")[1];
|
||||||
var schemeTo = params[2].split('=')[1];
|
var schemeTo = params[2].split("=")[1];
|
||||||
var policy = params[3].split('=')[1];
|
var policy = params[3].split("=")[1];
|
||||||
var optionalEarlierPolicy = '';
|
var optionalEarlierPolicy = "";
|
||||||
if (params[4]) {
|
if (params[4]) {
|
||||||
optionalEarlierPolicy = params[4].split('=')[1];
|
optionalEarlierPolicy = params[4].split("=")[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
response.setHeader('Content-Type', 'text/html; charset=utf-8', false);
|
response.setHeader("Content-Type", "text/html; charset=utf-8", false);
|
||||||
response.setHeader('Cache-Control', 'no-cache', false);
|
response.setHeader("Cache-Control", "no-cache", false);
|
||||||
response.write(createTest(schemeFrom, schemeTo, policy, optionalEarlierPolicy));
|
response.write(
|
||||||
}
|
createTest(schemeFrom, schemeTo, policy, optionalEarlierPolicy)
|
||||||
else if (action === 'create-2nd-level-iframe') {
|
);
|
||||||
|
} else if (action === "create-2nd-level-iframe") {
|
||||||
// ?action=create-2nd-level-iframe&scheme-from=http&scheme-to=https&policy=origin&type=form"
|
// ?action=create-2nd-level-iframe&scheme-from=http&scheme-to=https&policy=origin&type=form"
|
||||||
var schemeFrom = params[1].split('=')[1];
|
var schemeFrom = params[1].split("=")[1];
|
||||||
var schemeTo = params[2].split('=')[1];
|
var schemeTo = params[2].split("=")[1];
|
||||||
var policy = params[3].split('=')[1];
|
var policy = params[3].split("=")[1];
|
||||||
var type = params[4].split('=')[1];
|
var type = params[4].split("=")[1];
|
||||||
|
|
||||||
response.setHeader('Content-Type', 'text/html; charset=utf-8', false);
|
response.setHeader("Content-Type", "text/html; charset=utf-8", false);
|
||||||
response.setHeader('Cache-Control', 'no-cache', false);
|
response.setHeader("Cache-Control", "no-cache", false);
|
||||||
|
|
||||||
if (type === 'form') {
|
if (type === "form") {
|
||||||
response.write(createIframedFormTest(schemeFrom, schemeTo, policy));
|
response.write(createIframedFormTest(schemeFrom, schemeTo, policy));
|
||||||
} else if (type === 'window.location') {
|
} else if (type === "window.location") {
|
||||||
response.write(createIframedWindowLocationTest(
|
response.write(
|
||||||
schemeFrom, schemeTo, policy));
|
createIframedWindowLocationTest(schemeFrom, schemeTo, policy)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
} else if (action === "test") {
|
||||||
else if (action === 'test') {
|
|
||||||
// ?action=test&scheme=http-to-https&policy=origin&type=img
|
// ?action=test&scheme=http-to-https&policy=origin&type=img
|
||||||
var scheme = params[1].split('=')[1];
|
var scheme = params[1].split("=")[1];
|
||||||
var policy = params[2].split('=')[1];
|
var policy = params[2].split("=")[1];
|
||||||
var type = params[3].split('=')[1];
|
var type = params[3].split("=")[1];
|
||||||
var result = getSharedState(sharedKey);
|
var result = getSharedState(sharedKey);
|
||||||
|
|
||||||
if (result === '') {
|
if (result === "") {
|
||||||
result = {};
|
result = {};
|
||||||
} else {
|
} else {
|
||||||
result = JSON.parse(result);
|
result = JSON.parse(result);
|
||||||
@@ -250,42 +352,43 @@ function handleRequest(request, response) {
|
|||||||
result[type][scheme] = {};
|
result[type][scheme] = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request.hasHeader('Referer')) {
|
if (request.hasHeader("Referer")) {
|
||||||
result[type][scheme][policy] = request.getHeader('Referer');
|
result[type][scheme][policy] = request.getHeader("Referer");
|
||||||
} else {
|
} else {
|
||||||
result[type][scheme][policy] = '';
|
result[type][scheme][policy] = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
setSharedState(sharedKey, JSON.stringify(result));
|
setSharedState(sharedKey, JSON.stringify(result));
|
||||||
|
|
||||||
if (type === 'link') {
|
if (type === "link") {
|
||||||
var loc = 'https://example.com/tests/dom/base/test/file_bug704320_redirect.html';
|
var loc =
|
||||||
response.setStatusLine('1.1', 302, 'Found');
|
"https://example.com/tests/dom/base/test/file_bug704320_redirect.html";
|
||||||
response.setHeader('Location', loc, false);
|
response.setStatusLine("1.1", 302, "Found");
|
||||||
|
response.setHeader("Location", loc, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type === 'window.open') {
|
if (type === "window.open") {
|
||||||
response.setHeader('Cache-Control', 'no-cache', false);
|
response.setHeader("Cache-Control", "no-cache", false);
|
||||||
response.setHeader('Content-Type', 'text/html', false);
|
response.setHeader("Content-Type", "text/html", false);
|
||||||
response.write('<html><body><script>'
|
response.write(
|
||||||
+ 'window.opener.postMessage("window.open", "*");'
|
"<html><body><script>" +
|
||||||
+ '</script></body></html>');
|
'window.opener.postMessage("window.open", "*");' +
|
||||||
|
"</script></body></html>"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
} else if (action === "get-test-results") {
|
||||||
else if (action === 'get-test-results') {
|
|
||||||
// ?action=get-result
|
// ?action=get-result
|
||||||
response.setHeader('Cache-Control', 'no-cache', false);
|
response.setHeader("Cache-Control", "no-cache", false);
|
||||||
response.setHeader('Content-Type', 'text/plain', false);
|
response.setHeader("Content-Type", "text/plain", false);
|
||||||
response.write(getSharedState(sharedKey));
|
response.write(getSharedState(sharedKey));
|
||||||
}
|
} else if (action === "generate-policy-test") {
|
||||||
else if (action === 'generate-policy-test') {
|
|
||||||
// ?action=generate-policy-test&policy=b64-encoded-string
|
// ?action=generate-policy-test&policy=b64-encoded-string
|
||||||
response.setHeader('Cache-Control', 'no-cache', false);
|
response.setHeader("Cache-Control", "no-cache", false);
|
||||||
response.setHeader('Content-Type', 'text/html', false);
|
response.setHeader("Content-Type", "text/html", false);
|
||||||
var policy = unescape(params[1].split('=')[1]);
|
var policy = unescape(params[1].split("=")[1]);
|
||||||
var optionalEarlierPolicy = '';
|
var optionalEarlierPolicy = "";
|
||||||
if (params[2]) {
|
if (params[2]) {
|
||||||
optionalEarlierPolicy = params[2].split('=')[1];
|
optionalEarlierPolicy = params[2].split("=")[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
response.write(createPolicyTest(policy, optionalEarlierPolicy));
|
response.write(createPolicyTest(policy, optionalEarlierPolicy));
|
||||||
|
|||||||
@@ -1,17 +1,20 @@
|
|||||||
// Handle counting loads for bug 704320.
|
// Handle counting loads for bug 704320.
|
||||||
|
|
||||||
const SHARED_KEY = "bug704320_counter";
|
const SHARED_KEY = "bug704320_counter";
|
||||||
const DEFAULT_STATE = {'css': {'count': 0, 'referrers': []},
|
const DEFAULT_STATE = {
|
||||||
'img': {'count': 0, 'referrers': []},
|
css: { count: 0, referrers: [] },
|
||||||
'js': {'count': 0, 'referrers': []}};
|
img: { count: 0, referrers: [] },
|
||||||
const TYPE_MAP = {'css': 'text/css',
|
js: { count: 0, referrers: [] },
|
||||||
'js': 'application/javascript',
|
};
|
||||||
'img': 'image/png',
|
const TYPE_MAP = {
|
||||||
'html': 'text/html'};
|
css: "text/css",
|
||||||
|
js: "application/javascript",
|
||||||
|
img: "image/png",
|
||||||
|
html: "text/html",
|
||||||
|
};
|
||||||
|
|
||||||
// Writes an image to the response
|
// Writes an image to the response
|
||||||
function WriteOutImage(response)
|
function WriteOutImage(response) {
|
||||||
{
|
|
||||||
var file = Components.classes["@mozilla.org/file/directory_service;1"]
|
var file = Components.classes["@mozilla.org/file/directory_service;1"]
|
||||||
.getService(Components.interfaces.nsIProperties)
|
.getService(Components.interfaces.nsIProperties)
|
||||||
.get("CurWorkD", Components.interfaces.nsIFile);
|
.get("CurWorkD", Components.interfaces.nsIFile);
|
||||||
@@ -20,25 +23,25 @@ function WriteOutImage(response)
|
|||||||
file.append("image");
|
file.append("image");
|
||||||
file.append("test");
|
file.append("test");
|
||||||
file.append("mochitest");
|
file.append("mochitest");
|
||||||
file.append('blue.png');
|
file.append("blue.png");
|
||||||
|
|
||||||
var fileStream = Components.classes['@mozilla.org/network/file-input-stream;1']
|
var fileStream = Components.classes[
|
||||||
.createInstance(Components.interfaces.nsIFileInputStream);
|
"@mozilla.org/network/file-input-stream;1"
|
||||||
|
].createInstance(Components.interfaces.nsIFileInputStream);
|
||||||
fileStream.init(file, 1, 0, false);
|
fileStream.init(file, 1, 0, false);
|
||||||
response.bodyOutputStream.writeFrom(fileStream, fileStream.available());
|
response.bodyOutputStream.writeFrom(fileStream, fileStream.available());
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
var query = {};
|
var query = {};
|
||||||
request.queryString.split('&').forEach(function (val) {
|
request.queryString.split("&").forEach(function(val) {
|
||||||
var [name, value] = val.split('=');
|
var [name, value] = val.split("=");
|
||||||
query[name] = unescape(value);
|
query[name] = unescape(value);
|
||||||
});
|
});
|
||||||
|
|
||||||
var referrerLevel = "none";
|
var referrerLevel = "none";
|
||||||
if (request.hasHeader('Referer')) {
|
if (request.hasHeader("Referer")) {
|
||||||
let referrer = request.getHeader('Referer');
|
let referrer = request.getHeader("Referer");
|
||||||
if (referrer.indexOf("bug704320") > 0) {
|
if (referrer.indexOf("bug704320") > 0) {
|
||||||
referrerLevel = "full";
|
referrerLevel = "full";
|
||||||
} else if (referrer == "http://mochi.test:8888/") {
|
} else if (referrer == "http://mochi.test:8888/") {
|
||||||
@@ -47,7 +50,7 @@ function handleRequest(request, response)
|
|||||||
}
|
}
|
||||||
|
|
||||||
var state = getSharedState(SHARED_KEY);
|
var state = getSharedState(SHARED_KEY);
|
||||||
if (state === '') {
|
if (state === "") {
|
||||||
state = DEFAULT_STATE;
|
state = DEFAULT_STATE;
|
||||||
} else {
|
} else {
|
||||||
state = JSON.parse(state);
|
state = JSON.parse(state);
|
||||||
@@ -55,7 +58,6 @@ function handleRequest(request, response)
|
|||||||
|
|
||||||
response.setStatusLine(request.httpVersion, 200, "OK");
|
response.setStatusLine(request.httpVersion, 200, "OK");
|
||||||
|
|
||||||
|
|
||||||
//avoid confusing cache behaviors
|
//avoid confusing cache behaviors
|
||||||
response.setHeader("Cache-Control", "no-cache", false);
|
response.setHeader("Cache-Control", "no-cache", false);
|
||||||
|
|
||||||
@@ -73,20 +75,20 @@ function handleRequest(request, response)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ('type' in query) {
|
if ("type" in query) {
|
||||||
state[query.type].count++;
|
state[query.type].count++;
|
||||||
response.setHeader("Content-Type", TYPE_MAP[query.type], false);
|
response.setHeader("Content-Type", TYPE_MAP[query.type], false);
|
||||||
if (state[query.type].referrers.indexOf(referrerLevel) < 0) {
|
if (state[query.type].referrers.indexOf(referrerLevel) < 0) {
|
||||||
state[query.type].referrers.push(referrerLevel);
|
state[query.type].referrers.push(referrerLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (query.type == 'img') {
|
if (query.type == "img") {
|
||||||
WriteOutImage(response);
|
WriteOutImage(response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ('content' in query) {
|
if ("content" in query) {
|
||||||
response.write(unescape(query['content']));
|
response.write(unescape(query.content));
|
||||||
}
|
}
|
||||||
|
|
||||||
setSharedState(SHARED_KEY, JSON.stringify(state));
|
setSharedState(SHARED_KEY, JSON.stringify(state));
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
response.setStatusLine(request.httpVersion, 200, "Ok");
|
response.setStatusLine(request.httpVersion, 200, "Ok");
|
||||||
response.setHeader("X-appended-result", request.getHeader("X-appended-to-this"));
|
response.setHeader(
|
||||||
|
"X-appended-result",
|
||||||
|
request.getHeader("X-appended-to-this")
|
||||||
|
);
|
||||||
response.setHeader("X-Accept-Result", request.getHeader("Accept"));
|
response.setHeader("X-Accept-Result", request.getHeader("Accept"));
|
||||||
response.write("");
|
response.write("");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,8 @@ function handleRequest(request, response) {
|
|||||||
response.setHeader("Content-Type", "text/plain", false);
|
response.setHeader("Content-Type", "text/plain", false);
|
||||||
response.setHeader("Cache-Control", "no-cache", false);
|
response.setHeader("Cache-Control", "no-cache", false);
|
||||||
|
|
||||||
var referer = request.hasHeader("Referer") ? request.getHeader("Referer")
|
var referer = request.hasHeader("Referer")
|
||||||
|
? request.getHeader("Referer")
|
||||||
: "";
|
: "";
|
||||||
response.write("Referer: " + referer);
|
response.write("Referer: " + referer);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
let [status, statusText, encodedBody] = request.queryString.split("&");
|
let [status, statusText, encodedBody] = request.queryString.split("&");
|
||||||
let body = decodeURIComponent(encodedBody);
|
let body = decodeURIComponent(encodedBody);
|
||||||
response.setStatusLine(request.httpVersion, status, statusText);
|
response.setStatusLine(request.httpVersion, status, statusText);
|
||||||
|
|||||||
@@ -1,10 +1,18 @@
|
|||||||
// this will take strings_to_send.length*500 ms = 5 sec
|
// this will take strings_to_send.length*500 ms = 5 sec
|
||||||
|
|
||||||
var timer = null;
|
var timer = null;
|
||||||
var strings_to_send = ["retry:999999999\ndata\r\n\nda", "ta", ":", "de", "layed1\n\n",
|
var strings_to_send = [
|
||||||
|
"retry:999999999\ndata\r\n\nda",
|
||||||
|
"ta",
|
||||||
|
":",
|
||||||
|
"de",
|
||||||
|
"layed1\n\n",
|
||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
"data:delayed2\n\n", "", ""];
|
"data:delayed2\n\n",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
];
|
||||||
var resp = null;
|
var resp = null;
|
||||||
|
|
||||||
function sendNextString() {
|
function sendNextString() {
|
||||||
@@ -29,7 +37,7 @@ function handleRequest(request, response) {
|
|||||||
var bytes = strings_to_send.reduce((len, s) => len + s.length, 0);
|
var bytes = strings_to_send.reduce((len, s) => len + s.length, 0);
|
||||||
|
|
||||||
response.seizePower();
|
response.seizePower();
|
||||||
response.write("HTTP/1.1 200 OK\r\n")
|
response.write("HTTP/1.1 200 OK\r\n");
|
||||||
response.write(`Content-Length: ${bytes}\r\n`);
|
response.write(`Content-Length: ${bytes}\r\n`);
|
||||||
response.write("Content-Type: text/event-stream; charset=utf-8\r\n");
|
response.write("Content-Type: text/event-stream; charset=utf-8\r\n");
|
||||||
response.write("Cache-Control: no-cache, must-revalidate\r\n");
|
response.write("Cache-Control: no-cache, must-revalidate\r\n");
|
||||||
@@ -37,6 +45,12 @@ function handleRequest(request, response) {
|
|||||||
|
|
||||||
resp = response;
|
resp = response;
|
||||||
|
|
||||||
timer = Components.classes["@mozilla.org/timer;1"].createInstance(Components.interfaces.nsITimer);
|
timer = Components.classes["@mozilla.org/timer;1"].createInstance(
|
||||||
timer.initWithCallback(sendNextString, 500, Components.interfaces.nsITimer.TYPE_REPEATING_SLACK);
|
Components.interfaces.nsITimer
|
||||||
|
);
|
||||||
|
timer.initWithCallback(
|
||||||
|
sendNextString,
|
||||||
|
500,
|
||||||
|
Components.interfaces.nsITimer.TYPE_REPEATING_SLACK
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
const CC = Components.Constructor;
|
const CC = Components.Constructor;
|
||||||
const BinaryInputStream = CC("@mozilla.org/binaryinputstream;1",
|
const BinaryInputStream = CC(
|
||||||
|
"@mozilla.org/binaryinputstream;1",
|
||||||
"nsIBinaryInputStream",
|
"nsIBinaryInputStream",
|
||||||
"setInputStream");
|
"setInputStream"
|
||||||
|
);
|
||||||
|
|
||||||
function utf8decode(s) {
|
function utf8decode(s) {
|
||||||
return decodeURIComponent(escape(s));
|
return decodeURIComponent(escape(s));
|
||||||
@@ -23,34 +25,45 @@ function handleRequest(request, response) {
|
|||||||
|
|
||||||
if (request.method == "POST") {
|
if (request.method == "POST") {
|
||||||
var contentTypeParams = {};
|
var contentTypeParams = {};
|
||||||
request.getHeader("Content-Type").split(/\s*\;\s*/).forEach(function(s) {
|
request
|
||||||
if (s.indexOf('=') >= 0) {
|
.getHeader("Content-Type")
|
||||||
let [name, value] = s.split('=');
|
.split(/\s*\;\s*/)
|
||||||
|
.forEach(function(s) {
|
||||||
|
if (s.indexOf("=") >= 0) {
|
||||||
|
let [name, value] = s.split("=");
|
||||||
contentTypeParams[name] = value;
|
contentTypeParams[name] = value;
|
||||||
}
|
} else {
|
||||||
else {
|
contentTypeParams[""] = s;
|
||||||
contentTypeParams[''] = s;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (contentTypeParams[''] == "multipart/form-data" &&
|
if (
|
||||||
request.queryString == "") {
|
contentTypeParams[""] == "multipart/form-data" &&
|
||||||
requestBody.split("--" + contentTypeParams.boundary).slice(1, -1).forEach(function (s) {
|
request.queryString == ""
|
||||||
|
) {
|
||||||
|
requestBody
|
||||||
|
.split("--" + contentTypeParams.boundary)
|
||||||
|
.slice(1, -1)
|
||||||
|
.forEach(function(s) {
|
||||||
let headers = {};
|
let headers = {};
|
||||||
let headerEnd = s.indexOf("\r\n\r\n");
|
let headerEnd = s.indexOf("\r\n\r\n");
|
||||||
s.substr(2, headerEnd-2).split("\r\n").forEach(function(s) {
|
s.substr(2, headerEnd - 2)
|
||||||
|
.split("\r\n")
|
||||||
|
.forEach(function(s) {
|
||||||
// We're assuming UTF8 for now
|
// We're assuming UTF8 for now
|
||||||
let [name, value] = s.split(': ');
|
let [name, value] = s.split(": ");
|
||||||
headers[name] = utf8decode(value);
|
headers[name] = utf8decode(value);
|
||||||
});
|
});
|
||||||
|
|
||||||
let body = s.substring(headerEnd + 4, s.length - 2);
|
let body = s.substring(headerEnd + 4, s.length - 2);
|
||||||
if (!headers["Content-Type"] || headers["Content-Type"] == "text/plain") {
|
if (
|
||||||
|
!headers["Content-Type"] ||
|
||||||
|
headers["Content-Type"] == "text/plain"
|
||||||
|
) {
|
||||||
// We're assuming UTF8 for now
|
// We're assuming UTF8 for now
|
||||||
body = utf8decode(body);
|
body = utf8decode(body);
|
||||||
}
|
}
|
||||||
result.push({ headers: headers, body: body});
|
result.push({ headers, body });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,90 +1,92 @@
|
|||||||
// Test server for bug 1268962
|
// Test server for bug 1268962
|
||||||
'use strict';
|
"use strict";
|
||||||
Components.utils.importGlobalProperties(["URLSearchParams"]);
|
Components.utils.importGlobalProperties(["URLSearchParams"]);
|
||||||
const HTTPStatus = new Map([
|
const HTTPStatus = new Map([
|
||||||
[100, 'Continue'],
|
[100, "Continue"],
|
||||||
[101, 'Switching Protocol'],
|
[101, "Switching Protocol"],
|
||||||
[200, 'OK'],
|
[200, "OK"],
|
||||||
[201, 'Created'],
|
[201, "Created"],
|
||||||
[202, 'Accepted'],
|
[202, "Accepted"],
|
||||||
[203, 'Non-Authoritative Information'],
|
[203, "Non-Authoritative Information"],
|
||||||
[204, 'No Content'],
|
[204, "No Content"],
|
||||||
[205, 'Reset Content'],
|
[205, "Reset Content"],
|
||||||
[206, 'Partial Content'],
|
[206, "Partial Content"],
|
||||||
[300, 'Multiple Choice'],
|
[300, "Multiple Choice"],
|
||||||
[301, 'Moved Permanently'],
|
[301, "Moved Permanently"],
|
||||||
[302, 'Found'],
|
[302, "Found"],
|
||||||
[303, 'See Other'],
|
[303, "See Other"],
|
||||||
[304, 'Not Modified'],
|
[304, "Not Modified"],
|
||||||
[305, 'Use Proxy'],
|
[305, "Use Proxy"],
|
||||||
[306, 'unused'],
|
[306, "unused"],
|
||||||
[307, 'Temporary Redirect'],
|
[307, "Temporary Redirect"],
|
||||||
[308, 'Permanent Redirect'],
|
[308, "Permanent Redirect"],
|
||||||
[400, 'Bad Request'],
|
[400, "Bad Request"],
|
||||||
[401, 'Unauthorized'],
|
[401, "Unauthorized"],
|
||||||
[402, 'Payment Required'],
|
[402, "Payment Required"],
|
||||||
[403, 'Forbidden'],
|
[403, "Forbidden"],
|
||||||
[404, 'Not Found'],
|
[404, "Not Found"],
|
||||||
[405, 'Method Not Allowed'],
|
[405, "Method Not Allowed"],
|
||||||
[406, 'Not Acceptable'],
|
[406, "Not Acceptable"],
|
||||||
[407, 'Proxy Authentication Required'],
|
[407, "Proxy Authentication Required"],
|
||||||
[408, 'Request Timeout'],
|
[408, "Request Timeout"],
|
||||||
[409, 'Conflict'],
|
[409, "Conflict"],
|
||||||
[410, 'Gone'],
|
[410, "Gone"],
|
||||||
[411, 'Length Required'],
|
[411, "Length Required"],
|
||||||
[412, 'Precondition Failed'],
|
[412, "Precondition Failed"],
|
||||||
[413, 'Request Entity Too Large'],
|
[413, "Request Entity Too Large"],
|
||||||
[414, 'Request-URI Too Long'],
|
[414, "Request-URI Too Long"],
|
||||||
[415, 'Unsupported Media Type'],
|
[415, "Unsupported Media Type"],
|
||||||
[416, 'Requested Range Not Satisfiable'],
|
[416, "Requested Range Not Satisfiable"],
|
||||||
[417, 'Expectation Failed'],
|
[417, "Expectation Failed"],
|
||||||
[500, 'Internal Server Error'],
|
[500, "Internal Server Error"],
|
||||||
[501, 'Not Implemented'],
|
[501, "Not Implemented"],
|
||||||
[502, 'Bad Gateway'],
|
[502, "Bad Gateway"],
|
||||||
[503, 'Service Unavailable'],
|
[503, "Service Unavailable"],
|
||||||
[504, 'Gateway Timeout'],
|
[504, "Gateway Timeout"],
|
||||||
[505, 'HTTP Version Not Supported']
|
[505, "HTTP Version Not Supported"],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const SAME_ORIGIN = 'http://mochi.test:8888/tests/dom/base/test/file_bug1268962.sjs';
|
const SAME_ORIGIN =
|
||||||
const CROSS_ORIGIN = 'http://example.com/tests/dom/base/test/file_bug1268962.sjs';
|
"http://mochi.test:8888/tests/dom/base/test/file_bug1268962.sjs";
|
||||||
|
const CROSS_ORIGIN =
|
||||||
|
"http://example.com/tests/dom/base/test/file_bug1268962.sjs";
|
||||||
|
|
||||||
function handleRequest(request, response) {
|
function handleRequest(request, response) {
|
||||||
const queryMap = new URLSearchParams(request.queryString);
|
const queryMap = new URLSearchParams(request.queryString);
|
||||||
|
|
||||||
// Check redirection before everything else.
|
// Check redirection before everything else.
|
||||||
if (queryMap.has('redirect')) {
|
if (queryMap.has("redirect")) {
|
||||||
let redirect = queryMap.get('redirect');
|
let redirect = queryMap.get("redirect");
|
||||||
let location;
|
let location;
|
||||||
if (redirect == 'sameorigin') {
|
if (redirect == "sameorigin") {
|
||||||
location = SAME_ORIGIN;
|
location = SAME_ORIGIN;
|
||||||
} else if (redirect == 'crossorigin') {
|
} else if (redirect == "crossorigin") {
|
||||||
location = CROSS_ORIGIN;
|
location = CROSS_ORIGIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (location) {
|
if (location) {
|
||||||
// Use HTTP 302 redirection.
|
// Use HTTP 302 redirection.
|
||||||
response.setStatusLine('1.1', 302, HTTPStatus.get(302));
|
response.setStatusLine("1.1", 302, HTTPStatus.get(302));
|
||||||
|
|
||||||
// Forward query strings except the redirect option.
|
// Forward query strings except the redirect option.
|
||||||
queryMap.delete('redirect');
|
queryMap.delete("redirect");
|
||||||
response.setHeader('Location', location + '?' + queryMap.toString());
|
response.setHeader("Location", location + "?" + queryMap.toString());
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (queryMap.has('statusCode')) {
|
if (queryMap.has("statusCode")) {
|
||||||
let statusCode = parseInt(queryMap.get('statusCode'));
|
let statusCode = parseInt(queryMap.get("statusCode"));
|
||||||
let statusText = HTTPStatus.get(statusCode);
|
let statusText = HTTPStatus.get(statusCode);
|
||||||
response.setStatusLine('1.1', statusCode, statusText);
|
response.setStatusLine("1.1", statusCode, statusText);
|
||||||
}
|
}
|
||||||
if (queryMap.has('cacheControl')) {
|
if (queryMap.has("cacheControl")) {
|
||||||
let cacheControl = queryMap.get('cacheControl');
|
let cacheControl = queryMap.get("cacheControl");
|
||||||
response.setHeader('Cache-Control', cacheControl);
|
response.setHeader("Cache-Control", cacheControl);
|
||||||
}
|
}
|
||||||
if (queryMap.has('allowOrigin')) {
|
if (queryMap.has("allowOrigin")) {
|
||||||
let allowOrigin = queryMap.get('allowOrigin');
|
let allowOrigin = queryMap.get("allowOrigin");
|
||||||
response.setHeader('Access-Control-Allow-Origin', allowOrigin);
|
response.setHeader("Access-Control-Allow-Origin", allowOrigin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
response.setHeader("Content-Type", "text/plain", false);
|
response.setHeader("Content-Type", "text/plain", false);
|
||||||
response.write(decodeURIComponent(request.queryString));
|
response.write(decodeURIComponent(request.queryString));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,19 +5,18 @@ function handleRequest(request, response) {
|
|||||||
response.setHeader("Cache-Control", "no-cache", false);
|
response.setHeader("Cache-Control", "no-cache", false);
|
||||||
|
|
||||||
response.write(
|
response.write(
|
||||||
'<!DOCTYPE html>' +
|
"<!DOCTYPE html>" +
|
||||||
'<div></div>' +
|
"<div></div>" +
|
||||||
'<script>' +
|
"<script>" +
|
||||||
'function doWrite() {' +
|
"function doWrite() {" +
|
||||||
' document.write("<p></p>");' +
|
' document.write("<p></p>");' +
|
||||||
' parent.done();' +
|
" parent.done();" +
|
||||||
' document.close();' +
|
" document.close();" +
|
||||||
'}' +
|
"}" +
|
||||||
'setTimeout(doWrite, 0);' +
|
"setTimeout(doWrite, 0);" +
|
||||||
'</script>'
|
"</script>"
|
||||||
);
|
);
|
||||||
|
|
||||||
response.bodyOutputStream.flush();
|
response.bodyOutputStream.flush();
|
||||||
// leave the stream open
|
// leave the stream open
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,22 +5,28 @@ const nsITimer = Components.interfaces.nsITimer;
|
|||||||
function attemptUnblock(s) {
|
function attemptUnblock(s) {
|
||||||
try {
|
try {
|
||||||
let blockedResponse = null;
|
let blockedResponse = null;
|
||||||
getObjectState("bug503481_" + s, function(x) {blockedResponse = x.wrappedJSObject.r});
|
getObjectState("bug503481_" + s, function(x) {
|
||||||
|
blockedResponse = x.wrappedJSObject.r;
|
||||||
|
});
|
||||||
blockedResponse.finish();
|
blockedResponse.finish();
|
||||||
setObjectState("bug503481_" + s, null);
|
setObjectState("bug503481_" + s, null);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
dump("unable to unblock " + s + "retrying in half a second\n");
|
dump("unable to unblock " + s + "retrying in half a second\n");
|
||||||
timer = Components.classes["@mozilla.org/timer;1"]
|
timer = Components.classes["@mozilla.org/timer;1"].createInstance(nsITimer);
|
||||||
.createInstance(nsITimer);
|
timer.initWithCallback(
|
||||||
timer.initWithCallback(function () { attemptUnblock(s) }, 500, nsITimer.TYPE_ONE_SHOT);
|
function() {
|
||||||
|
attemptUnblock(s);
|
||||||
|
},
|
||||||
|
500,
|
||||||
|
nsITimer.TYPE_ONE_SHOT
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
var query = {};
|
var query = {};
|
||||||
request.queryString.split('&').forEach(function (val) {
|
request.queryString.split("&").forEach(function(val) {
|
||||||
var [name, value] = val.split('=');
|
var [name, value] = val.split("=");
|
||||||
query[name] = unescape(value);
|
query[name] = unescape(value);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -32,7 +38,12 @@ function handleRequest(request, response)
|
|||||||
|
|
||||||
if (query.blockOn) {
|
if (query.blockOn) {
|
||||||
response.processAsync();
|
response.processAsync();
|
||||||
x = { r: response, QueryInterface: function(iid) { return this } };
|
x = {
|
||||||
|
r: response,
|
||||||
|
QueryInterface(iid) {
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
};
|
||||||
x.wrappedJSObject = x;
|
x.wrappedJSObject = x;
|
||||||
setObjectState("bug503481_" + query.blockOn, x);
|
setObjectState("bug503481_" + query.blockOn, x);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
// Echos the referrer back to the requester.
|
// Echos the referrer back to the requester.
|
||||||
response.setHeader('Content-Type', 'text/plain', false);
|
response.setHeader("Content-Type", "text/plain", false);
|
||||||
response.write(request.getHeader('Referer'));
|
response.write(request.getHeader("Referer"));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,19 @@
|
|||||||
var timer;
|
var timer;
|
||||||
|
|
||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
response.setHeader("Cache-Control", "no-cache", false);
|
response.setHeader("Cache-Control", "no-cache", false);
|
||||||
response.setHeader("Content-Type", "text/plain", false);
|
response.setHeader("Content-Type", "text/plain", false);
|
||||||
response.write("Responded");
|
response.write("Responded");
|
||||||
response.processAsync();
|
response.processAsync();
|
||||||
timer = Components.classes["@mozilla.org/timer;1"]
|
timer = Components.classes["@mozilla.org/timer;1"].createInstance(
|
||||||
.createInstance(Components.interfaces.nsITimer);
|
Components.interfaces.nsITimer
|
||||||
timer.initWithCallback(function() {
|
);
|
||||||
|
timer.initWithCallback(
|
||||||
|
function() {
|
||||||
response.finish();
|
response.finish();
|
||||||
// 50ms certainly be enough for one refresh driver firing to happen!
|
// 50ms certainly be enough for one refresh driver firing to happen!
|
||||||
}, 50, Components.interfaces.nsITimer.TYPE_ONE_SHOT);
|
},
|
||||||
|
50,
|
||||||
|
Components.interfaces.nsITimer.TYPE_ONE_SHOT
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
response.processAsync();
|
response.processAsync();
|
||||||
response.setHeader("Content-Type", "text/plain", false);
|
response.setHeader("Content-Type", "text/plain", false);
|
||||||
response.setHeader("X-Frame-Options", "DENY", false);
|
response.setHeader("X-Frame-Options", "DENY", false);
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
if (request.hasHeader("User-Agent")) {
|
if (request.hasHeader("User-Agent")) {
|
||||||
response.setHeader("Result-User-Agent",
|
response.setHeader("Result-User-Agent", request.getHeader("User-Agent"));
|
||||||
request.getHeader("User-Agent"));
|
|
||||||
}
|
}
|
||||||
response.write("");
|
response.write("");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,47 +1,68 @@
|
|||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
if (
|
||||||
if ((request.queryString == "test=user1_xhr" &&
|
(request.queryString == "test=user1_xhr" &&
|
||||||
request.hasHeader("Authorization") &&
|
request.hasHeader("Authorization") &&
|
||||||
request.getHeader("Authorization") == "Basic dXNlciAxOnBhc3N3b3JkIDE=") ||
|
request.getHeader("Authorization") == "Basic dXNlciAxOnBhc3N3b3JkIDE=") ||
|
||||||
(request.queryString == "test=user1_evtsrc" &&
|
(request.queryString == "test=user1_evtsrc" &&
|
||||||
request.hasHeader("Authorization") &&
|
request.hasHeader("Authorization") &&
|
||||||
request.getHeader("Authorization") == "Basic dXNlciAxOnBhc3N3b3JkIDE=")) {
|
request.getHeader("Authorization") == "Basic dXNlciAxOnBhc3N3b3JkIDE=")
|
||||||
|
) {
|
||||||
response.setStatusLine(null, 200, "OK");
|
response.setStatusLine(null, 200, "OK");
|
||||||
response.setHeader("Content-Type", "text/event-stream", false);
|
response.setHeader("Content-Type", "text/event-stream", false);
|
||||||
response.setHeader("Access-Control-Allow-Origin", "http://mochi.test:8888", false);
|
response.setHeader(
|
||||||
|
"Access-Control-Allow-Origin",
|
||||||
|
"http://mochi.test:8888",
|
||||||
|
false
|
||||||
|
);
|
||||||
response.setHeader("Access-Control-Allow-Credentials", "true", false);
|
response.setHeader("Access-Control-Allow-Credentials", "true", false);
|
||||||
response.setHeader("Cache-Control", "no-cache, must-revalidate", false);
|
response.setHeader("Cache-Control", "no-cache, must-revalidate", false);
|
||||||
if (request.queryString == "test=user1_xhr") {
|
if (request.queryString == "test=user1_xhr") {
|
||||||
response.setHeader("Set-Cookie", "test=5c", false);
|
response.setHeader("Set-Cookie", "test=5c", false);
|
||||||
}
|
}
|
||||||
response.write("event: message\ndata: 1\n\n");
|
response.write("event: message\ndata: 1\n\n");
|
||||||
} else if ((request.queryString == "test=user2_xhr" &&
|
} else if (
|
||||||
|
(request.queryString == "test=user2_xhr" &&
|
||||||
request.hasHeader("Authorization") &&
|
request.hasHeader("Authorization") &&
|
||||||
request.getHeader("Authorization") == "Basic dXNlciAyOnBhc3N3b3JkIDI=") ||
|
request.getHeader("Authorization") == "Basic dXNlciAyOnBhc3N3b3JkIDI=") ||
|
||||||
(request.queryString == "test=user2_evtsrc" &&
|
(request.queryString == "test=user2_evtsrc" &&
|
||||||
request.hasHeader("Authorization") &&
|
request.hasHeader("Authorization") &&
|
||||||
request.getHeader("Authorization") == "Basic dXNlciAyOnBhc3N3b3JkIDI=" &&
|
request.getHeader("Authorization") == "Basic dXNlciAyOnBhc3N3b3JkIDI=" &&
|
||||||
request.hasHeader("Cookie") &&
|
request.hasHeader("Cookie") &&
|
||||||
request.getHeader("Cookie") == "test=5d")) {
|
request.getHeader("Cookie") == "test=5d")
|
||||||
|
) {
|
||||||
response.setStatusLine(null, 200, "OK");
|
response.setStatusLine(null, 200, "OK");
|
||||||
response.setHeader("Content-Type", "text/event-stream", false);
|
response.setHeader("Content-Type", "text/event-stream", false);
|
||||||
response.setHeader("Access-Control-Allow-Origin", "http://mochi.test:8888", false);
|
response.setHeader(
|
||||||
|
"Access-Control-Allow-Origin",
|
||||||
|
"http://mochi.test:8888",
|
||||||
|
false
|
||||||
|
);
|
||||||
response.setHeader("Access-Control-Allow-Credentials", "true", false);
|
response.setHeader("Access-Control-Allow-Credentials", "true", false);
|
||||||
response.setHeader("Cache-Control", "no-cache, must-revalidate", false);
|
response.setHeader("Cache-Control", "no-cache, must-revalidate", false);
|
||||||
if (request.queryString == "test=user2_xhr") {
|
if (request.queryString == "test=user2_xhr") {
|
||||||
response.setHeader("Set-Cookie", "test=5d", false);
|
response.setHeader("Set-Cookie", "test=5d", false);
|
||||||
}
|
}
|
||||||
response.write("event: message\ndata: 1\n\n");
|
response.write("event: message\ndata: 1\n\n");
|
||||||
} else if (request.queryString == "test=user1_xhr" ||
|
} else if (
|
||||||
request.queryString == "test=user2_xhr") {
|
request.queryString == "test=user1_xhr" ||
|
||||||
|
request.queryString == "test=user2_xhr"
|
||||||
|
) {
|
||||||
response.setStatusLine(null, 401, "Unauthorized");
|
response.setStatusLine(null, 401, "Unauthorized");
|
||||||
response.setHeader("WWW-Authenticate", "basic realm=\"restricted\"", false);
|
response.setHeader("WWW-Authenticate", 'basic realm="restricted"', false);
|
||||||
response.setHeader("Access-Control-Allow-Origin", "http://mochi.test:8888", false);
|
response.setHeader(
|
||||||
|
"Access-Control-Allow-Origin",
|
||||||
|
"http://mochi.test:8888",
|
||||||
|
false
|
||||||
|
);
|
||||||
response.setHeader("Access-Control-Allow-Credentials", "true", false);
|
response.setHeader("Access-Control-Allow-Credentials", "true", false);
|
||||||
response.write("Unauthorized");
|
response.write("Unauthorized");
|
||||||
} else {
|
} else {
|
||||||
response.setStatusLine(null, 403, "Forbidden");
|
response.setStatusLine(null, 403, "Forbidden");
|
||||||
response.setHeader("Access-Control-Allow-Origin", "http://mochi.test:8888", false);
|
response.setHeader(
|
||||||
|
"Access-Control-Allow-Origin",
|
||||||
|
"http://mochi.test:8888",
|
||||||
|
false
|
||||||
|
);
|
||||||
response.setHeader("Access-Control-Allow-Credentials", "true", false);
|
response.setHeader("Access-Control-Allow-Credentials", "true", false);
|
||||||
response.write("Forbidden");
|
response.write("Forbidden");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,18 @@
|
|||||||
// SJS file for X-Frame-Options mochitests
|
// SJS file for X-Frame-Options mochitests
|
||||||
function handleRequest(request, response)
|
function handleRequest(request, response) {
|
||||||
{
|
|
||||||
var query = {};
|
var query = {};
|
||||||
var BOUNDARY = "BOUNDARYOMG3984";
|
var BOUNDARY = "BOUNDARYOMG3984";
|
||||||
request.queryString.split('&').forEach(function (val) {
|
request.queryString.split("&").forEach(function(val) {
|
||||||
var [name, value] = val.split('=');
|
var [name, value] = val.split("=");
|
||||||
query[name] = unescape(value);
|
query[name] = unescape(value);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (query['multipart'] == "1") {
|
if (query.multipart == "1") {
|
||||||
response.setHeader("Content-Type", "multipart/x-mixed-replace;boundary=" + BOUNDARY, false);
|
response.setHeader(
|
||||||
|
"Content-Type",
|
||||||
|
"multipart/x-mixed-replace;boundary=" + BOUNDARY,
|
||||||
|
false
|
||||||
|
);
|
||||||
response.setHeader("Cache-Control", "no-cache", false);
|
response.setHeader("Cache-Control", "no-cache", false);
|
||||||
response.setStatusLine(request.httpVersion, 200, "OK");
|
response.setStatusLine(request.httpVersion, 200, "OK");
|
||||||
response.write("--" + BOUNDARY + "\r\n");
|
response.write("--" + BOUNDARY + "\r\n");
|
||||||
@@ -20,45 +23,45 @@ function handleRequest(request, response)
|
|||||||
}
|
}
|
||||||
|
|
||||||
var testHeaders = {
|
var testHeaders = {
|
||||||
"deny": "DENY",
|
deny: "DENY",
|
||||||
"sameorigin": "SAMEORIGIN",
|
sameorigin: "SAMEORIGIN",
|
||||||
"sameorigin2": "SAMEORIGIN, SAMEORIGIN",
|
sameorigin2: "SAMEORIGIN, SAMEORIGIN",
|
||||||
"sameorigin3": "SAMEORIGIN,SAMEORIGIN , SAMEORIGIN",
|
sameorigin3: "SAMEORIGIN,SAMEORIGIN , SAMEORIGIN",
|
||||||
"mixedpolicy": "DENY,SAMEORIGIN",
|
mixedpolicy: "DENY,SAMEORIGIN",
|
||||||
|
|
||||||
/* added for bug 836132 */
|
/* added for bug 836132 */
|
||||||
"afa": "ALLOW-FROM http://mochi.test:8888/",
|
afa: "ALLOW-FROM http://mochi.test:8888/",
|
||||||
"afd": "ALLOW-FROM http://example.com/",
|
afd: "ALLOW-FROM http://example.com/",
|
||||||
"afa1": "ALLOW-FROM http://mochi.test:8888",
|
afa1: "ALLOW-FROM http://mochi.test:8888",
|
||||||
"afd1": "ALLOW-FROM:example.com",
|
afd1: "ALLOW-FROM:example.com",
|
||||||
"afd2": "ALLOW-FROM: example.com",
|
afd2: "ALLOW-FROM: example.com",
|
||||||
"afd3": "ALLOW-FROM example.com",
|
afd3: "ALLOW-FROM example.com",
|
||||||
"afd4": "ALLOW-FROM:http://example.com",
|
afd4: "ALLOW-FROM:http://example.com",
|
||||||
"afd5": "ALLOW-FROM: http://example.com",
|
afd5: "ALLOW-FROM: http://example.com",
|
||||||
"afd6": "ALLOW-FROM http://example.com",
|
afd6: "ALLOW-FROM http://example.com",
|
||||||
"afd7": "ALLOW-FROM:mochi.test:8888",
|
afd7: "ALLOW-FROM:mochi.test:8888",
|
||||||
"afd8": "ALLOW-FROM: mochi.test:8888",
|
afd8: "ALLOW-FROM: mochi.test:8888",
|
||||||
"afd9": "ALLOW-FROM:http://mochi.test:8888",
|
afd9: "ALLOW-FROM:http://mochi.test:8888",
|
||||||
"afd10": "ALLOW-FROM: http://mochi.test:8888",
|
afd10: "ALLOW-FROM: http://mochi.test:8888",
|
||||||
"afd11": "ALLOW-FROM mochi.test:8888",
|
afd11: "ALLOW-FROM mochi.test:8888",
|
||||||
"afd12": "ALLOW-FROM",
|
afd12: "ALLOW-FROM",
|
||||||
"afd13": "ALLOW-FROM ",
|
afd13: "ALLOW-FROM ",
|
||||||
"afd14": "ALLOW-FROM:"
|
afd14: "ALLOW-FROM:",
|
||||||
};
|
};
|
||||||
|
|
||||||
if (testHeaders.hasOwnProperty(query['xfo'])) {
|
if (testHeaders.hasOwnProperty(query.xfo)) {
|
||||||
response.setHeader("X-Frame-Options", testHeaders[query['xfo']], false);
|
response.setHeader("X-Frame-Options", testHeaders[query.xfo], false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// from the test harness we'll be checking for the presence of this element
|
// from the test harness we'll be checking for the presence of this element
|
||||||
// to test if the page loaded
|
// to test if the page loaded
|
||||||
response.write("<h1 id=\"test\">" + query["testid"] + "</h1>");
|
response.write('<h1 id="test">' + query.testid + "</h1>");
|
||||||
|
|
||||||
if (query['testid'] == "postmessage") {
|
if (query.testid == "postmessage") {
|
||||||
response.write("<script>parent.opener.postMessage('ok', '*');</script>");
|
response.write("<script>parent.opener.postMessage('ok', '*');</script>");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (query['multipart'] == "1") {
|
if (query.multipart == "1") {
|
||||||
response.write("\r\n--" + BOUNDARY + "\r\n");
|
response.write("\r\n--" + BOUNDARY + "\r\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user