summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2018-12-09 21:35:26 +0100
committerRyan Dahl <ry@tinyclouds.org>2018-12-09 15:35:26 -0500
commit2b1733e936b5fff34583628367bbe99244041d55 (patch)
treee3f9d4c64fc913b941b3e68bd8f130f374d031b9
parent2b360c60a5b7bfd9b1ac3c1afc8f38ffb9209d32 (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.ts42
-rw-r--r--http.ts8
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}/`);
diff --git a/http.ts b/http.ts
index e709dd4a3..508d1ecaa 100644
--- a/http.ts
+++ b/http.ts
@@ -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;