From 3cfc1244d8747a869fb370de2d057523852fbea9 Mon Sep 17 00:00:00 2001 From: Vincent LE GOFF Date: Thu, 23 May 2019 01:28:03 +0200 Subject: http: make server handle bad client requests properly (denoland/deno_std#419) Original: https://github.com/denoland/deno_std/commit/7620fe1a82ba5694e17d51133d94230b06d1517a --- http/server.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) (limited to 'http/server.ts') diff --git a/http/server.ts b/http/server.ts index 3886e7672..809cf39ff 100644 --- a/http/server.ts +++ b/http/server.ts @@ -197,7 +197,7 @@ export class ServerRequest { } } -async function readRequest( +export async function readRequest( bufr: BufReader ): Promise<[ServerRequest, BufState]> { const req = new ServerRequest(); @@ -235,7 +235,11 @@ export class Server implements AsyncIterable { let req: ServerRequest; while (!this.closing) { - [req, bufStateErr] = await readRequest(bufr); + try { + [req, bufStateErr] = await readRequest(bufr); + } catch (err) { + bufStateErr = err; + } if (bufStateErr) break; req.w = w; yield req; @@ -247,7 +251,11 @@ export class Server implements AsyncIterable { if (bufStateErr === "EOF") { // The connection was gracefully closed. } else if (bufStateErr instanceof Error) { - // TODO(ry): send something back like a HTTP 500 status. + // An error was thrown while parsing request headers. + await writeResponse(req.w, { + status: 400, + body: new TextEncoder().encode(`${bufStateErr.message}\r\n\r\n`) + }); } else if (this.closing) { // There are more requests incoming but the server is closing. // TODO(ry): send a back a HTTP 503 Service Unavailable status. -- cgit v1.2.3