summaryrefslogtreecommitdiff
path: root/std/http/server.ts
diff options
context:
space:
mode:
authorKevin (Kun) "Kassimo" Qian <kevinkassimo@gmail.com>2019-12-11 16:46:03 -0800
committerRy Dahl <ry@tinyclouds.org>2019-12-12 08:46:03 +0800
commitc3c69aff7e1df1a9480d2a5e9a0fa17cf3af6409 (patch)
treea00e51e02cb7390b684065d3a4018eb84d80a78c /std/http/server.ts
parent407195ea870a82f4341671d6718f813bd9a3b7ac (diff)
fix(std/http): close connection on .respond() error (#3475)
Diffstat (limited to 'std/http/server.ts')
-rw-r--r--std/http/server.ts29
1 files changed, 24 insertions, 5 deletions
diff --git a/std/http/server.ts b/std/http/server.ts
index ce32511b1..71c145d6f 100644
--- a/std/http/server.ts
+++ b/std/http/server.ts
@@ -107,7 +107,7 @@ export class ServerRequest {
conn!: Conn;
r!: BufReader;
w!: BufWriter;
- done: Deferred<void> = deferred();
+ done: Deferred<Error | undefined> = deferred();
public async *bodyStream(): AsyncIterableIterator<Uint8Array> {
if (this.headers.has("content-length")) {
@@ -193,11 +193,24 @@ export class ServerRequest {
}
async respond(r: Response): Promise<void> {
- // Write our response!
- await writeResponse(this.w, r);
+ let err: Error | undefined;
+ try {
+ // Write our response!
+ await writeResponse(this.w, r);
+ } catch (e) {
+ try {
+ // Eagerly close on error.
+ this.conn.close();
+ } catch {}
+ err = e;
+ }
// Signal that this request has been processed and the next pipelined
// request on the same connection can be accepted.
- this.done.resolve();
+ this.done.resolve(err);
+ if (err) {
+ // Error during responding, rethrow.
+ throw err;
+ }
}
}
@@ -338,7 +351,13 @@ export class Server implements AsyncIterable<ServerRequest> {
// Wait for the request to be processed before we accept a new request on
// this connection.
- await req!.done;
+ const procError = await req!.done;
+ if (procError) {
+ // Something bad happened during response.
+ // (likely other side closed during pipelined req)
+ // req.done implies this connection already closed, so we can just return.
+ return;
+ }
}
if (req! === Deno.EOF) {