content-type-router
Version:
This is a strictly structured router module designed for internal use only. It assumes all incoming request are either json, text or file/blob via POST method. It doesn't parse flexible parameter in path either.
97 lines (96 loc) • 3.42 kB
JavaScript
;
async function init(req, res, env, map) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS');
res.setHeader('Access-Control-Allow-Credentials', false);
res.setHeader('Access-Control-Max-Age', '3600');
res.setHeader('Access-Control-Allow-Headers', 'Origin, Content-Type, Accept, Authorization');
if (map[req.url]) {
switch (req.method) {
case 'OPTIONS':
res.statusCode = 200;
res.end();
break;
case 'GET':
map[req.url](req, res, env);
break;
case 'POST':
switch (req.headers['content-type']) {
case 'application/json':
{
let json = await processJson(req, res);
await map[req.url](req, res, env, json);
break;
}
case 'undefined':
case 'null':
case '':
case undefined:
case null:
res.statusCode = 406;
res.statusMessage = "The provided content MIME type is not acceptable";
res.end();
break;
default:
{
let file = await processFile(req, res);
await map[req.url](req, res, env, file);
break;
}
}
break;
default:
res.statusCode = 406;
res.statusMessage = "The provided method is not acceptable";
res.end();
}
} else {
res.statusCode = 404;
res.statusMessage = "Service does not exist";
res.end();
}
}
async function processJson(req, res) {
return new Promise(function(resolve, reject) {
try {
let text = '';
let json = {};
req.on('data', (chunk) => {
text += chunk;
});
req.on('end', () => {
json = JSON.parse(text) || {};
resolve(json);
});
} catch (e) {
res.statusCode = 406;
res.statusMessage = "The incoming JSON string is invalid";
res.end();
reject(e);
}
});
}
async function processFile(req, res) {
return new Promise(function(resolve, reject) {
try {
let buffer = Buffer.alloc(0);
req.on('data', (chunk) => {
buffer = Buffer.concat([buffer, chunk]);
});
req.on('end', () => {
let file = {
buffer: buffer,
contentType: req.headers['content-type'],
contentCategory: req.headers['content-type'].split('/')[0]
};
resolve(file);
});
} catch (e) {
res.statusCode = 500;
res.statusMessage = "Something goes wrong while parsing FILE";
res.end();
reject(e);
}
});
}
exports.init = init;