summaryrefslogtreecommitdiff
path: root/std/http/file_server.ts
diff options
context:
space:
mode:
Diffstat (limited to 'std/http/file_server.ts')
-rw-r--r--[-rwxr-xr-x]std/http/file_server.ts111
1 files changed, 75 insertions, 36 deletions
diff --git a/std/http/file_server.ts b/std/http/file_server.ts
index ffcf31e54..0ece60560 100755..100644
--- a/std/http/file_server.ts
+++ b/std/http/file_server.ts
@@ -7,7 +7,13 @@
// https://github.com/indexzero/http-server/blob/master/test/http-server-test.js
import { posix, extname } from "../path/mod.ts";
-import { listenAndServe, ServerRequest, Response } from "./server.ts";
+import {
+ listenAndServe,
+ listenAndServeTLS,
+ ServerRequest,
+ Response,
+ HTTPSOptions,
+} from "./server.ts";
import { parse } from "../flags/mod.ts";
import { assert } from "../_util/assert.ts";
@@ -28,6 +34,14 @@ interface FileServerArgs {
// -h --help
h: boolean;
help: boolean;
+ // --host
+ host: string;
+ // -c --cert
+ c: string;
+ cert: string;
+ // -k --key
+ k: string;
+ key: string;
}
const encoder = new TextEncoder();
@@ -49,6 +63,7 @@ const MEDIA_TYPES: Record<string, string> = {
".gz": "application/gzip",
".css": "text/css",
".wasm": "application/wasm",
+ ".mjs": "application/javascript",
};
/** Returns the content-type based on the extension of a path. */
@@ -306,7 +321,19 @@ function html(strings: TemplateStringsArray, ...values: unknown[]): string {
function main(): void {
const CORSEnabled = serverArgs.cors ? true : false;
- const addr = `0.0.0.0:${serverArgs.port ?? serverArgs.p ?? 4507}`;
+ const port = serverArgs.port ?? serverArgs.p ?? 4507;
+ const host = serverArgs.host ?? "0.0.0.0";
+ const addr = `${host}:${port}`;
+ const tlsOpts = {} as HTTPSOptions;
+ tlsOpts.certFile = serverArgs.cert ?? serverArgs.c ?? "";
+ tlsOpts.keyFile = serverArgs.key ?? serverArgs.k ?? "";
+
+ if (tlsOpts.keyFile || tlsOpts.certFile) {
+ if (tlsOpts.keyFile === "" || tlsOpts.certFile === "") {
+ console.log("--key and --cert are required for TLS");
+ serverArgs.h = true;
+ }
+ }
if (serverArgs.h ?? serverArgs.help) {
console.log(`Deno File Server
@@ -321,50 +348,62 @@ function main(): void {
OPTIONS:
-h, --help Prints help information
-p, --port <PORT> Set port
- --cors Enable CORS via the "Access-Control-Allow-Origin" header`);
+ --cors Enable CORS via the "Access-Control-Allow-Origin" header
+ --host <HOST> Hostname (default is 0.0.0.0)
+ -c, --cert <FILE> TLS certificate file (enables TLS)
+ -k, --key <FILE> TLS key file (enables TLS)
+
+ All TLS options are required when one is provided.`);
+
Deno.exit();
}
- listenAndServe(
- addr,
- async (req): Promise<void> => {
- let normalizedUrl = posix.normalize(req.url);
- try {
- normalizedUrl = decodeURIComponent(normalizedUrl);
- } catch (e) {
- if (!(e instanceof URIError)) {
- throw e;
- }
+ const handler = async (req: ServerRequest): Promise<void> => {
+ let normalizedUrl = posix.normalize(req.url);
+ try {
+ normalizedUrl = decodeURIComponent(normalizedUrl);
+ } catch (e) {
+ if (!(e instanceof URIError)) {
+ throw e;
}
- const fsPath = posix.join(target, normalizedUrl);
+ }
+ const fsPath = posix.join(target, normalizedUrl);
- let response: Response | undefined;
+ let response: Response | undefined;
+ try {
+ const fileInfo = await Deno.stat(fsPath);
+ if (fileInfo.isDirectory) {
+ response = await serveDir(req, fsPath);
+ } else {
+ response = await serveFile(req, fsPath);
+ }
+ } catch (e) {
+ console.error(e.message);
+ response = await serveFallback(req, e);
+ } finally {
+ if (CORSEnabled) {
+ assert(response);
+ setCORS(response);
+ }
+ serverLog(req, response!);
try {
- const fileInfo = await Deno.stat(fsPath);
- if (fileInfo.isDirectory) {
- response = await serveDir(req, fsPath);
- } else {
- response = await serveFile(req, fsPath);
- }
+ await req.respond(response!);
} catch (e) {
console.error(e.message);
- response = await serveFallback(req, e);
- } finally {
- if (CORSEnabled) {
- assert(response);
- setCORS(response);
- }
- serverLog(req, response!);
- try {
- await req.respond(response!);
- } catch (e) {
- console.error(e.message);
- }
}
- },
- );
+ }
+ };
- console.log(`HTTP server listening on http://${addr}/`);
+ let proto = "http";
+ if (tlsOpts.keyFile || tlsOpts.certFile) {
+ proto += "s";
+ tlsOpts.hostname = host;
+ tlsOpts.port = port;
+ listenAndServeTLS(tlsOpts, handler);
+ } else {
+ listenAndServe(addr, handler);
+ }
+ console.log(`${proto.toUpperCase()} server listening on ${proto}://${addr}/`);
}
if (import.meta.main) {