summaryrefslogtreecommitdiff
path: root/http/server.ts
diff options
context:
space:
mode:
authorVincent LE GOFF <g_n_s@hotmail.fr>2019-05-23 01:28:03 +0200
committerBert Belder <bertbelder@gmail.com>2019-05-22 16:28:03 -0700
commit3cfc1244d8747a869fb370de2d057523852fbea9 (patch)
tree6be9d1308fae58b8d843dec01b3080edac9e89c6 /http/server.ts
parente2debab359f2e07b6a784fbc50df31e39a4cba29 (diff)
http: make server handle bad client requests properly (denoland/deno_std#419)
Original: https://github.com/denoland/deno_std/commit/7620fe1a82ba5694e17d51133d94230b06d1517a
Diffstat (limited to 'http/server.ts')
-rw-r--r--http/server.ts14
1 files changed, 11 insertions, 3 deletions
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<ServerRequest> {
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<ServerRequest> {
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.