Last active
September 18, 2021 05:11
-
-
Save zakcodez/e2d4c1a867a2f826ce67bdddc043cc4c to your computer and use it in GitHub Desktop.
A simple server using Node.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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