diff options
| author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2018-12-09 21:35:26 +0100 |
|---|---|---|
| committer | Ryan Dahl <ry@tinyclouds.org> | 2018-12-09 15:35:26 -0500 |
| commit | 2b1733e936b5fff34583628367bbe99244041d55 (patch) | |
| tree | e3f9d4c64fc913b941b3e68bd8f130f374d031b9 | |
| parent | 2b360c60a5b7bfd9b1ac3c1afc8f38ffb9209d32 (diff) | |
Simple file server (denoland/deno_std#11)
Original: https://github.com/denoland/deno_std/commit/c8e5d98900884f583d91c7c2526fca8bbc50be1b
| -rwxr-xr-x[-rw-r--r--] | file_server.ts | 42 | ||||
| -rw-r--r-- | http.ts | 8 |
2 files changed, 42 insertions, 8 deletions
diff --git a/file_server.ts b/file_server.ts index d5deccf3c..498f9b9d2 100644..100755 --- a/file_server.ts +++ b/file_server.ts @@ -1,18 +1,44 @@ +#!/usr/bin/env deno --allow-net + +// This program serves files in the current directory over HTTP. +// TODO Supply the directory to serve as a CLI argument. +// TODO Stream responses instead of reading them into memory. +// TODO Add tests like these: +// https://github.com/indexzero/http-server/blob/master/test/http-server-test.js + import { listenAndServe } from "./http.ts"; -import { open, cwd } from "deno"; +import { cwd, readFile, DenoError, ErrorKind } from "deno"; const addr = "0.0.0.0:4500"; -const d = cwd(); +const currentDir = cwd(); + +const encoder = new TextEncoder(); + +listenAndServe(addr, async req => { + const fileName = req.url.replace(/\/$/, '/index.html'); + const filePath = currentDir + fileName; + let file; -listenAndServe(addr, async req => { - const filename = d + "/" + req.url; - let res; try { - res = { status: 200, body: open(filename) }; + file = await readFile(filePath); } catch (e) { - res = { status: 500, body: "bad" }; + if (e instanceof DenoError && e.kind === ErrorKind.NotFound) { + await req.respond({ status: 404, body: encoder.encode("Not found") }); + } else { + await req.response({ status: 500, body: encoder.encode("Internal server error") }); + } + return; + } + + const headers = new Headers(); + headers.set('content-type', 'octet-stream'); + + const res = { + status: 200, + body: file, + headers, } - req.respond(res); + await req.respond(res); }); console.log(`HTTP server listening on http://${addr}/`); @@ -82,6 +82,14 @@ export async function* serve(addr: string) { listener.close(); } +export async function listenAndServe(addr: string, handler: (ServerRequest) => void) { + const server = serve(addr); + + for await (const request of server) { + await handler(request); + } +} + interface Response { status?: number; headers?: Headers; |
