summaryrefslogtreecommitdiff
path: root/file_server.ts
diff options
context:
space:
mode:
Diffstat (limited to 'file_server.ts')
-rwxr-xr-x[-rw-r--r--]file_server.ts42
1 files changed, 34 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}/`);