diff options
| author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2018-12-12 10:38:46 +0100 |
|---|---|---|
| committer | Ryan Dahl <ry@tinyclouds.org> | 2018-12-12 04:38:46 -0500 |
| commit | 0212401974434271653e50cc9d8f7188d72a8880 (patch) | |
| tree | b458b4c793c3985d49b38e6a892db4c1b22f62c7 | |
| parent | b94530332910c0b85553dc91fa1912bce308df3c (diff) | |
File server logging (denoland/deno_std#17)
Original: https://github.com/denoland/deno_std/commit/108127178b7cfd881ea18fabc92d0ee9bf72fd20
| -rwxr-xr-x | file_server.ts | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/file_server.ts b/file_server.ts index d2b9fe0b0..8159132b3 100755 --- a/file_server.ts +++ b/file_server.ts @@ -5,7 +5,7 @@ // TODO Add tests like these: // https://github.com/indexzero/http-server/blob/master/test/http-server-test.js -import { listenAndServe, ServerRequest, setContentLength } from "./http"; +import { listenAndServe, ServerRequest, setContentLength, Response } from "./http"; import { cwd, readFile, DenoError, ErrorKind, args, stat, readDir } from "deno"; const dirViewerTemplate = ` @@ -143,7 +143,7 @@ async function serveDir(req: ServerRequest, dirPath: string, dirName: string) { headers }; setContentLength(res); - await req.respond(res); + return res; } async function serveFile(req: ServerRequest, filename: string) { @@ -156,7 +156,7 @@ async function serveFile(req: ServerRequest, filename: string) { body: file, headers }; - await req.respond(res); + return res; } async function serveFallback(req: ServerRequest, e: Error) { @@ -164,31 +164,45 @@ async function serveFallback(req: ServerRequest, e: Error) { e instanceof DenoError && (e as DenoError<any>).kind === ErrorKind.NotFound ) { - await req.respond({ status: 404, body: encoder.encode("Not found") }); + return { + status: 404, + body: encoder.encode("Not found") + }; } else { - await req.respond({ + return { status: 500, body: encoder.encode("Internal server error") - }); + }; } } +function serverLog(req: ServerRequest, res: Response) { + const d = new Date().toISOString(); + const dateFmt = `[${d.slice(0, 10)} ${d.slice(11, 19)}]`; + const s = `${dateFmt} "${req.method} ${req.url} ${req.proto}" ${res.status}`; + console.log(s); +} + listenAndServe(addr, async req => { const fileName = req.url.replace(/\/$/, ""); const filePath = currentDir + fileName; + let response: Response; + try { const fileInfo = await stat(filePath); if (fileInfo.isDirectory()) { // Bug with deno.stat: name and path not populated // Yuck! - await serveDir(req, filePath, fileName); + response = await serveDir(req, filePath, fileName); } else { - await serveFile(req, filePath); + response = await serveFile(req, filePath); } } catch (e) { - await serveFallback(req, e); - return; + response = await serveFallback(req, e); + } finally { + serverLog(req, response); + req.respond(response); } }); |
