Skip to content

Instantly share code, notes, and snippets.

@zakcodez
Last active September 18, 2021 05:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zakcodez/e2d4c1a867a2f826ce67bdddc043cc4c to your computer and use it in GitHub Desktop.
Save zakcodez/e2d4c1a867a2f826ce67bdddc043cc4c to your computer and use it in GitHub Desktop.
A simple server using Node.js
const http = require("http");
const path = require("path");
const url = require("url");
const fs = require("fs");
const config = {
app: {
http: {
port: 80,
host: "0.0.0.0"
}
}
}
const server = http.createServer((req, res) => {
const parsedUrl = url.parse(req.url, true);
const filename = path.join(__dirname, parsedUrl.filename);
const exists = fs.existsSync(filename);
try {
if (exists) {
const data = fs.readFileSync(filename);
const extension = path.extname(filename);
const mimeType = (function (extension) {
/** @type {{ [extension: string]: string }} */
const mimeTypes = {
"3gp": "video/3gpp",
"a": "application/octet-stream",
"ai": "application/postscript",
"aif": "audio/x-aiff",
"aiff": "audio/x-aiff",
"asc": "application/pgp-signature",
"asf": "video/x-ms-asf",
"asm": "text/x-asm",
"asx": "video/x-ms-asf",
"atom": "application/atom+xml",
"au": "audio/basic",
"avi": "video/x-msvideo",
"bat": "application/x-msdownload",
"bin": "application/octet-stream",
"bmp": "image/bmp",
"bz2": "application/x-bzip2",
"c": "text/x-c",
"cab": "application/vnd.ms-cab-compressed",
"cc": "text/x-c",
"chm": "application/vnd.ms-htmlhelp",
"class": "application/octet-stream",
"com": "application/x-msdownload",
"conf": "text/plain",
"cpp": "text/x-c",
"crt": "application/x-x509-ca-cert",
"css": "text/css",
"csv": "text/csv",
"cxx": "text/x-c",
"deb": "application/x-debian-package",
"der": "application/x-x509-ca-cert",
"diff": "text/x-diff",
"djv": "image/vnd.djvu",
"djvu": "image/vnd.djvu",
"dll": "application/x-msdownload",
"dmg": "application/octet-stream",
"doc": "application/msword",
"dot": "application/msword",
"dtd": "application/xml-dtd",
"dvi": "application/x-dvi",
"ear": "application/java-archive",
"eml": "message/rfc822",
"eps": "application/postscript",
"exe": "application/x-msdownload",
"f": "text/x-fortran",
"f77": "text/x-fortran",
"f90": "text/x-fortran",
"flv": "video/x-flv",
"for": "text/x-fortran",
"gem": "application/octet-stream",
"gemspec": "text/x-script.ruby",
"gif": "image/gif",
"gz": "application/x-gzip",
"h": "text/x-c",
"hh": "text/x-c",
"htm": "text/html",
"html": "text/html",
"ico": "image/vnd.microsoft.icon",
"ics": "text/calendar",
"ifb": "text/calendar",
"iso": "application/octet-stream",
"jar": "application/java-archive",
"java": "text/x-java-source",
"jnlp": "application/x-java-jnlp-file",
"jpeg": "image/jpeg",
"jpg": "image/jpeg",
"js": "application/javascript",
"json": "application/json",
"log": "text/plain",
"m3u": "audio/x-mpegurl",
"m4v": "video/mp4",
"man": "text/troff",
"mathml": "application/mathml+xml",
"mbox": "application/mbox",
"mdoc": "text/troff",
"me": "text/troff",
"mid": "audio/midi",
"midi": "audio/midi",
"mime": "message/rfc822",
"mml": "application/mathml+xml",
"mng": "video/x-mng",
"mov": "video/quicktime",
"mp3": "audio/mpeg",
"mp4": "video/mp4",
"mp4v": "video/mp4",
"mpeg": "video/mpeg",
"mpg": "video/mpeg",
"ms": "text/troff",
"msi": "application/x-msdownload",
"odp": "application/vnd.oasis.opendocument.presentation",
"ods": "application/vnd.oasis.opendocument.spreadsheet",
"odt": "application/vnd.oasis.opendocument.text",
"ogg": "application/ogg",
"p": "text/x-pascal",
"pas": "text/x-pascal",
"pbm": "image/x-portable-bitmap",
"pdf": "application/pdf",
"pem": "application/x-x509-ca-cert",
"pgm": "image/x-portable-graymap",
"pgp": "application/pgp-encrypted",
"pkg": "application/octet-stream",
"pl": "text/x-script.perl",
"pm": "text/x-script.perl-module",
"png": "image/png",
"pnm": "image/x-portable-anymap",
"ppm": "image/x-portable-pixmap",
"pps": "application/vnd.ms-powerpoint",
"ppt": "application/vnd.ms-powerpoint",
"ps": "application/postscript",
"psd": "image/vnd.adobe.photoshop",
"py": "text/x-script.python",
"qt": "video/quicktime",
"ra": "audio/x-pn-realaudio",
"rake": "text/x-script.ruby",
"ram": "audio/x-pn-realaudio",
"rar": "application/x-rar-compressed",
"rb": "text/x-script.ruby",
"rdf": "application/rdf+xml",
"roff": "text/troff",
"rpm": "application/x-redhat-package-manager",
"rss": "application/rss+xml",
"rtf": "application/rtf",
"ru": "text/x-script.ruby",
"s": "text/x-asm",
"sgm": "text/sgml",
"sgml": "text/sgml",
"sh": "application/x-sh",
"sig": "application/pgp-signature",
"snd": "audio/basic",
"so": "application/octet-stream",
"svg": "image/svg+xml",
"svgz": "image/svg+xml",
"swf": "application/x-shockwave-flash",
"t": "text/troff",
"tar": "application/x-tar",
"tbz": "application/x-bzip-compressed-tar",
"tcl": "application/x-tcl",
"tex": "application/x-tex",
"texi": "application/x-texinfo",
"texinfo": "application/x-texinfo",
"text": "text/plain",
"tif": "image/tiff",
"tiff": "image/tiff",
"torrent": "application/x-bittorrent",
"tr": "text/troff",
"txt": "text/plain",
"vcf": "text/x-vcard",
"vcs": "text/x-vcalendar",
"vrml": "model/vrml",
"war": "application/java-archive",
"wav": "audio/x-wav",
"wma": "audio/x-ms-wma",
"wmv": "video/x-ms-wmv",
"wmx": "video/x-ms-wmx",
"wrl": "model/vrml",
"wsdl": "application/wsdl+xml",
"xbm": "image/x-xbitmap",
"xhtml": "application/xhtml+xml",
"xls": "application/vnd.ms-excel",
"xml": "application/xml",
"xpm": "image/x-xpixmap",
"xsl": "application/xml",
"xslt": "application/xslt+xml",
"yaml": "text/yaml",
"yml": "text/yaml",
"zip": "application/zip"
}
return mimeTypes[extension]
|| "application/octet-stream";
})(extension);
res.statusCode = 200;
res.statusMessage = "200 OK";
res.setHeader("Content-Type", mimeType);
res.write(data);
} else {
const message = `Cannot ${req.method} ${parsedUrl.filename}`;
res.statusCode = 404;
res.statusMessage = "404 Not Found";
res.setHeader("Content-Type", "text/plain");
res.write(message);
}
} catch (error) {
const message = "Internal Server Error";
res.statusCode = 500;
res.statusMessage = message;
res.setHeader("Content-Type", "text/plain");
res.write(message);
} finally {
res.end();
}
});
server.on("listening", () => {
const { host, port } = config.app.http;
console.log(`App listening at ${host}:${port}`);
});
server.listen(config.app.http);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment