Last active
November 29, 2018 03:30
-
-
Save hashrock/a9ea912db2c086c0c31e3950aeb67388 to your computer and use it in GitHub Desktop.
Simple HTTP Server in deno (WIP), this is just a toy code, DO NOT USE THIS.
This file contains 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
/** | |
* Simple HTTP Server | |
*/ | |
import { serve } from "https://deno.land/x/net/http.ts"; | |
import * as deno from "deno"; | |
import { mime } from "./mime"; | |
const addr = "0.0.0.0:8000"; | |
const s = serve(addr); | |
console.log(`listening on http://${addr}/`); | |
function urlToPath(url: string): string { | |
let pathName = url.replace(/\\/g, "/"); | |
if (pathName.charAt(0) === "/") { | |
pathName = pathName.substr(1); | |
} | |
if (pathName === "") { | |
pathName = "index.html"; | |
} | |
return pathName; | |
} | |
function getMime(ext) { | |
for (let k of Object.keys(mime)) { | |
if (mime[k].indexOf(ext) > -1) { | |
return k; | |
} | |
} | |
return ""; | |
} | |
async function main() { | |
for await (const req of s) { | |
let pathName = urlToPath(req.url); | |
try { | |
let stat = deno.statSync(pathName); | |
if (stat.isFile()) { | |
const body = await deno.readFile(pathName); | |
const headers = new Headers(); | |
const sep = pathName.split("."); | |
const ext = sep[sep.length - 1]; | |
headers.append("Content-Type", getMime(ext)); | |
await req.respond({ status: 200, body, headers }); | |
} else { | |
await req.respond({ | |
status: 404, | |
body: new TextEncoder().encode("Not Found") | |
}); | |
} | |
} catch (e) { | |
await req.respond({ | |
status: 404, | |
body: new TextEncoder().encode("Not Found") | |
}); | |
} | |
} | |
} | |
main(); |
This file contains 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
// taken from https://unpkg.com/mime@2.4.0/types/standard.json | |
export const mime = { | |
"application/andrew-inset": ["ez"], | |
"application/applixware": ["aw"], | |
"application/atom+xml": ["atom"], | |
"application/atomcat+xml": ["atomcat"], | |
"application/atomsvc+xml": ["atomsvc"], | |
"application/bdoc": ["bdoc"], | |
"application/ccxml+xml": ["ccxml"], | |
"application/cdmi-capability": ["cdmia"], | |
"application/cdmi-container": ["cdmic"], | |
"application/cdmi-domain": ["cdmid"], | |
"application/cdmi-object": ["cdmio"], | |
"application/cdmi-queue": ["cdmiq"], | |
"application/cu-seeme": ["cu"], | |
"application/dash+xml": ["mpd"], | |
"application/davmount+xml": ["davmount"], | |
"application/docbook+xml": ["dbk"], | |
"application/dssc+der": ["dssc"], | |
"application/dssc+xml": ["xdssc"], | |
"application/ecmascript": ["ecma", "es"], | |
"application/emma+xml": ["emma"], | |
"application/epub+zip": ["epub"], | |
"application/exi": ["exi"], | |
"application/font-tdpfr": ["pfr"], | |
"application/geo+json": ["geojson"], | |
"application/gml+xml": ["gml"], | |
"application/gpx+xml": ["gpx"], | |
"application/gxf": ["gxf"], | |
"application/gzip": ["gz"], | |
"application/hjson": ["hjson"], | |
"application/hyperstudio": ["stk"], | |
"application/inkml+xml": ["ink", "inkml"], | |
"application/ipfix": ["ipfix"], | |
"application/java-archive": ["jar", "war", "ear"], | |
"application/java-serialized-object": ["ser"], | |
"application/java-vm": ["class"], | |
"application/javascript": ["js", "mjs"], | |
"application/json": ["json", "map"], | |
"application/json5": ["json5"], | |
"application/jsonml+json": ["jsonml"], | |
"application/ld+json": ["jsonld"], | |
"application/lost+xml": ["lostxml"], | |
"application/mac-binhex40": ["hqx"], | |
"application/mac-compactpro": ["cpt"], | |
"application/mads+xml": ["mads"], | |
"application/manifest+json": ["webmanifest"], | |
"application/marc": ["mrc"], | |
"application/marcxml+xml": ["mrcx"], | |
"application/mathematica": ["ma", "nb", "mb"], | |
"application/mathml+xml": ["mathml"], | |
"application/mbox": ["mbox"], | |
"application/mediaservercontrol+xml": ["mscml"], | |
"application/metalink+xml": ["metalink"], | |
"application/metalink4+xml": ["meta4"], | |
"application/mets+xml": ["mets"], | |
"application/mods+xml": ["mods"], | |
"application/mp21": ["m21", "mp21"], | |
"application/mp4": ["mp4s", "m4p"], | |
"application/msword": ["doc", "dot"], | |
"application/mxf": ["mxf"], | |
"application/octet-stream": [ | |
"bin", | |
"dms", | |
"lrf", | |
"mar", | |
"so", | |
"dist", | |
"distz", | |
"pkg", | |
"bpk", | |
"dump", | |
"elc", | |
"deploy", | |
"exe", | |
"dll", | |
"deb", | |
"dmg", | |
"iso", | |
"img", | |
"msi", | |
"msp", | |
"msm", | |
"buffer" | |
], | |
"application/oda": ["oda"], | |
"application/oebps-package+xml": ["opf"], | |
"application/ogg": ["ogx"], | |
"application/omdoc+xml": ["omdoc"], | |
"application/onenote": ["onetoc", "onetoc2", "onetmp", "onepkg"], | |
"application/oxps": ["oxps"], | |
"application/patch-ops-error+xml": ["xer"], | |
"application/pdf": ["pdf"], | |
"application/pgp-encrypted": ["pgp"], | |
"application/pgp-signature": ["asc", "sig"], | |
"application/pics-rules": ["prf"], | |
"application/pkcs10": ["p10"], | |
"application/pkcs7-mime": ["p7m", "p7c"], | |
"application/pkcs7-signature": ["p7s"], | |
"application/pkcs8": ["p8"], | |
"application/pkix-attr-cert": ["ac"], | |
"application/pkix-cert": ["cer"], | |
"application/pkix-crl": ["crl"], | |
"application/pkix-pkipath": ["pkipath"], | |
"application/pkixcmp": ["pki"], | |
"application/pls+xml": ["pls"], | |
"application/postscript": ["ai", "eps", "ps"], | |
"application/pskc+xml": ["pskcxml"], | |
"application/raml+yaml": ["raml"], | |
"application/rdf+xml": ["rdf", "owl"], | |
"application/reginfo+xml": ["rif"], | |
"application/relax-ng-compact-syntax": ["rnc"], | |
"application/resource-lists+xml": ["rl"], | |
"application/resource-lists-diff+xml": ["rld"], | |
"application/rls-services+xml": ["rs"], | |
"application/rpki-ghostbusters": ["gbr"], | |
"application/rpki-manifest": ["mft"], | |
"application/rpki-roa": ["roa"], | |
"application/rsd+xml": ["rsd"], | |
"application/rss+xml": ["rss"], | |
"application/rtf": ["rtf"], | |
"application/sbml+xml": ["sbml"], | |
"application/scvp-cv-request": ["scq"], | |
"application/scvp-cv-response": ["scs"], | |
"application/scvp-vp-request": ["spq"], | |
"application/scvp-vp-response": ["spp"], | |
"application/sdp": ["sdp"], | |
"application/set-payment-initiation": ["setpay"], | |
"application/set-registration-initiation": ["setreg"], | |
"application/shf+xml": ["shf"], | |
"application/smil+xml": ["smi", "smil"], | |
"application/sparql-query": ["rq"], | |
"application/sparql-results+xml": ["srx"], | |
"application/srgs": ["gram"], | |
"application/srgs+xml": ["grxml"], | |
"application/sru+xml": ["sru"], | |
"application/ssdl+xml": ["ssdl"], | |
"application/ssml+xml": ["ssml"], | |
"application/tei+xml": ["tei", "teicorpus"], | |
"application/thraud+xml": ["tfi"], | |
"application/timestamped-data": ["tsd"], | |
"application/voicexml+xml": ["vxml"], | |
"application/wasm": ["wasm"], | |
"application/widget": ["wgt"], | |
"application/winhlp": ["hlp"], | |
"application/wsdl+xml": ["wsdl"], | |
"application/wspolicy+xml": ["wspolicy"], | |
"application/xaml+xml": ["xaml"], | |
"application/xcap-diff+xml": ["xdf"], | |
"application/xenc+xml": ["xenc"], | |
"application/xhtml+xml": ["xhtml", "xht"], | |
"application/xml": ["xml", "xsl", "xsd", "rng"], | |
"application/xml-dtd": ["dtd"], | |
"application/xop+xml": ["xop"], | |
"application/xproc+xml": ["xpl"], | |
"application/xslt+xml": ["xslt"], | |
"application/xspf+xml": ["xspf"], | |
"application/xv+xml": ["mxml", "xhvml", "xvml", "xvm"], | |
"application/yang": ["yang"], | |
"application/yin+xml": ["yin"], | |
"application/zip": ["zip"], | |
"audio/3gpp": ["*3gpp"], | |
"audio/adpcm": ["adp"], | |
"audio/basic": ["au", "snd"], | |
"audio/midi": ["mid", "midi", "kar", "rmi"], | |
"audio/mp3": ["*mp3"], | |
"audio/mp4": ["m4a", "mp4a"], | |
"audio/mpeg": ["mpga", "mp2", "mp2a", "mp3", "m2a", "m3a"], | |
"audio/ogg": ["oga", "ogg", "spx"], | |
"audio/s3m": ["s3m"], | |
"audio/silk": ["sil"], | |
"audio/wav": ["wav"], | |
"audio/wave": ["*wav"], | |
"audio/webm": ["weba"], | |
"audio/xm": ["xm"], | |
"font/collection": ["ttc"], | |
"font/otf": ["otf"], | |
"font/ttf": ["ttf"], | |
"font/woff": ["woff"], | |
"font/woff2": ["woff2"], | |
"image/aces": ["exr"], | |
"image/apng": ["apng"], | |
"image/bmp": ["bmp"], | |
"image/cgm": ["cgm"], | |
"image/dicom-rle": ["drle"], | |
"image/emf": ["emf"], | |
"image/fits": ["fits"], | |
"image/g3fax": ["g3"], | |
"image/gif": ["gif"], | |
"image/heic": ["heic"], | |
"image/heic-sequence": ["heics"], | |
"image/heif": ["heif"], | |
"image/heif-sequence": ["heifs"], | |
"image/ief": ["ief"], | |
"image/jls": ["jls"], | |
"image/jp2": ["jp2", "jpg2"], | |
"image/jpeg": ["jpeg", "jpg", "jpe"], | |
"image/jpm": ["jpm"], | |
"image/jpx": ["jpx", "jpf"], | |
"image/ktx": ["ktx"], | |
"image/png": ["png"], | |
"image/sgi": ["sgi"], | |
"image/svg+xml": ["svg", "svgz"], | |
"image/t38": ["t38"], | |
"image/tiff": ["tif", "tiff"], | |
"image/tiff-fx": ["tfx"], | |
"image/webp": ["webp"], | |
"image/wmf": ["wmf"], | |
"message/disposition-notification": ["disposition-notification"], | |
"message/global": ["u8msg"], | |
"message/global-delivery-status": ["u8dsn"], | |
"message/global-disposition-notification": ["u8mdn"], | |
"message/global-headers": ["u8hdr"], | |
"message/rfc822": ["eml", "mime"], | |
"model/gltf+json": ["gltf"], | |
"model/gltf-binary": ["glb"], | |
"model/iges": ["igs", "iges"], | |
"model/mesh": ["msh", "mesh", "silo"], | |
"model/vrml": ["wrl", "vrml"], | |
"model/x3d+binary": ["x3db", "x3dbz"], | |
"model/x3d+vrml": ["x3dv", "x3dvz"], | |
"model/x3d+xml": ["x3d", "x3dz"], | |
"text/cache-manifest": ["appcache", "manifest"], | |
"text/calendar": ["ics", "ifb"], | |
"text/coffeescript": ["coffee", "litcoffee"], | |
"text/css": ["css"], | |
"text/csv": ["csv"], | |
"text/html": ["html", "htm", "shtml"], | |
"text/jade": ["jade"], | |
"text/jsx": ["jsx"], | |
"text/less": ["less"], | |
"text/markdown": ["markdown", "md"], | |
"text/mathml": ["mml"], | |
"text/n3": ["n3"], | |
"text/plain": ["txt", "text", "conf", "def", "list", "log", "in", "ini"], | |
"text/richtext": ["rtx"], | |
"text/rtf": ["*rtf"], | |
"text/sgml": ["sgml", "sgm"], | |
"text/shex": ["shex"], | |
"text/slim": ["slim", "slm"], | |
"text/stylus": ["stylus", "styl"], | |
"text/tab-separated-values": ["tsv"], | |
"text/troff": ["t", "tr", "roff", "man", "me", "ms"], | |
"text/turtle": ["ttl"], | |
"text/uri-list": ["uri", "uris", "urls"], | |
"text/vcard": ["vcard"], | |
"text/vtt": ["vtt"], | |
"text/xml": ["*xml"], | |
"text/yaml": ["yaml", "yml"], | |
"video/3gpp": ["3gp", "3gpp"], | |
"video/3gpp2": ["3g2"], | |
"video/h261": ["h261"], | |
"video/h263": ["h263"], | |
"video/h264": ["h264"], | |
"video/jpeg": ["jpgv"], | |
"video/jpm": ["*jpm", "jpgm"], | |
"video/mj2": ["mj2", "mjp2"], | |
"video/mp2t": ["ts"], | |
"video/mp4": ["mp4", "mp4v", "mpg4"], | |
"video/mpeg": ["mpeg", "mpg", "mpe", "m1v", "m2v"], | |
"video/ogg": ["ogv"], | |
"video/quicktime": ["qt", "mov"], | |
"video/webm": ["webm"] | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment