diff options
author | Kevin (Kun) "Kassimo" Qian <kevinkassimo@gmail.com> | 2019-12-11 16:46:03 -0800 |
---|---|---|
committer | Ry Dahl <ry@tinyclouds.org> | 2019-12-12 08:46:03 +0800 |
commit | c3c69aff7e1df1a9480d2a5e9a0fa17cf3af6409 (patch) | |
tree | a00e51e02cb7390b684065d3a4018eb84d80a78c /std/http/server.ts | |
parent | 407195ea870a82f4341671d6718f813bd9a3b7ac (diff) |
fix(std/http): close connection on .respond() error (#3475)
Diffstat (limited to 'std/http/server.ts')
-rw-r--r-- | std/http/server.ts | 29 |
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) { |