/* 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';
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 = createQueryMap(request);
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(body);
}
for (let [key, value] of queryMap) {
response.setHeader(key, value);
}
function createQueryMap(request) {
const queryMap = new Map();
request.queryString.split('&')
//split on first "="
.map((component) => component.split(/=(.+)?/))
.forEach(pair => queryMap.set(pair[0], decodeURIComponent(pair[1])));
return queryMap;
}
}