/* 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; } }