/* Generic responder that composes a response from
* the query string of a request.
*
* It reserves some special prop names:
* - body: get's used as the response body
* - statusCode: override the 200 OK response code
* (response text is set automatically)
*
* Any property names it doesn't know about get converted into
* HTTP headers.
*
* For example:
* http://test/resource.sjs?Content-Type=text/html&body=
hello
&Hello=hi
*
* Outputs:
* HTTP/1.1 200 OK
* Content-Type: text/html
* Hello: hi
* hello
*/
//global handleRequest
"use strict";
Cu.importGlobalProperties(["URLSearchParams"]);
const HTTPStatus = new Map([
[100, "Continue"],
[101, "Switching Protocol"],
[200, "OK"],
[201, "Created"],
[202, "Accepted"],
[203, "Non-Authoritative Information"],
[204, "No Content"],
[205, "Reset Content"],
[206, "Partial Content"],
[300, "Multiple Choice"],
[301, "Moved Permanently"],
[302, "Found"],
[303, "See Other"],
[304, "Not Modified"],
[305, "Use Proxy"],
[306, "unused"],
[307, "Temporary Redirect"],
[308, "Permanent Redirect"],
[400, "Bad Request"],
[401, "Unauthorized"],
[402, "Payment Required"],
[403, "Forbidden"],
[404, "Not Found"],
[405, "Method Not Allowed"],
[406, "Not Acceptable"],
[407, "Proxy Authentication Required"],
[408, "Request Timeout"],
[409, "Conflict"],
[410, "Gone"],
[411, "Length Required"],
[412, "Precondition Failed"],
[413, "Request Entity Too Large"],
[414, "Request-URI Too Long"],
[415, "Unsupported Media Type"],
[416, "Requested Range Not Satisfiable"],
[417, "Expectation Failed"],
[500, "Internal Server Error"],
[501, "Not Implemented"],
[502, "Bad Gateway"],
[503, "Service Unavailable"],
[504, "Gateway Timeout"],
[505, "HTTP Version Not Supported"],
]);
function handleRequest(request, response) {
const queryMap = new URLSearchParams(request.queryString);
if (queryMap.has("statusCode")) {
let statusCode = parseInt(queryMap.get("statusCode"));
let statusText = HTTPStatus.get(statusCode);
queryMap.delete("statusCode");
response.setStatusLine("1.1", statusCode, statusText);
}
if (queryMap.has("body")) {
let body = queryMap.get("body") || "";
queryMap.delete("body");
response.write(decodeURIComponent(body));
}
for (let [key, value] of queryMap.entries()) {
response.setHeader(key, value);
}
}