diff options
author | Divy Srivastava <dj.srivastava23@gmail.com> | 2024-07-04 20:19:42 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-05 08:49:42 +0530 |
commit | b290fd01f3f5d32f9d010fc719ced0240759c049 (patch) | |
tree | fde9a587801e99ca234c5c889498cc1d353e3a58 /ext/node/polyfills/http.ts | |
parent | 0bbfd6fb3dcae70c3cd727ef1cb45296f83c9680 (diff) |
fix(ext/node): http chunked writes hangs (#24428)
Fixes https://github.com/denoland/deno/issues/24239
Diffstat (limited to 'ext/node/polyfills/http.ts')
-rw-r--r-- | ext/node/polyfills/http.ts | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/ext/node/polyfills/http.ts b/ext/node/polyfills/http.ts index 40155d998..dde7c4e41 100644 --- a/ext/node/polyfills/http.ts +++ b/ext/node/polyfills/http.ts @@ -1349,7 +1349,6 @@ export class ServerResponse extends NodeWritable { // used by `npm:on-finished` finished = false; headersSent = false; - #firstChunk: Chunk | null = null; #resolve: (value: Response | PromiseLike<Response>) => void; // deno-lint-ignore no-explicit-any #socketOverride: any | null = null; @@ -1386,28 +1385,25 @@ export class ServerResponse extends NodeWritable { autoDestroy: true, defaultEncoding: "utf-8", emitClose: true, + // FIXME: writes don't work when a socket is assigned and then + // detached. write: (chunk, encoding, cb) => { + // Writes chunks are directly written to the socket if + // one is assigned via assignSocket() if (this.#socketOverride && this.#socketOverride.writable) { this.#socketOverride.write(chunk, encoding); return cb(); } if (!this.headersSent) { - if (this.#firstChunk === null) { - this.#firstChunk = chunk; - return cb(); - } else { - ServerResponse.#enqueue(controller, this.#firstChunk); - this.#firstChunk = null; - this.respond(false); - } + ServerResponse.#enqueue(controller, chunk); + this.respond(false); + return cb(); } ServerResponse.#enqueue(controller, chunk); return cb(); }, final: (cb) => { - if (this.#firstChunk) { - this.respond(true, this.#firstChunk); - } else if (!this.headersSent) { + if (!this.headersSent) { this.respond(true); } controller.close(); |