From e78cc553e09f7378c02bb7341b1accef1b47032b Mon Sep 17 00:00:00 2001 From: Manuel Schiller Date: Tue, 14 Oct 2025 01:41:11 +0200 Subject: [PATCH 1/5] fix: trigger abort signal only upon connection close, not upon req close for POST requests, 'close' on req is emitted when the HTTP message has been fully received, NOT when the connection closed --- src/adapters/_node/request.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/adapters/_node/request.ts b/src/adapters/_node/request.ts index 1c4653b4..8def8fb3 100644 --- a/src/adapters/_node/request.ts +++ b/src/adapters/_node/request.ts @@ -85,7 +85,7 @@ export const NodeRequest: { get signal() { if (!this.#abortSignal) { this.#abortSignal = new AbortController(); - this._node.req.once("close", () => { + this._node.req.socket.once("close", () => { this.#abortSignal?.abort(); }); } From 74f0073c203cadd6ee2dfedef7413ef34fb49ed9 Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Tue, 14 Oct 2025 14:37:34 +0200 Subject: [PATCH 2/5] make diff less --- src/adapters/_node/request.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/adapters/_node/request.ts b/src/adapters/_node/request.ts index 8def8fb3..747b47aa 100644 --- a/src/adapters/_node/request.ts +++ b/src/adapters/_node/request.ts @@ -85,7 +85,11 @@ export const NodeRequest: { get signal() { if (!this.#abortSignal) { this.#abortSignal = new AbortController(); - this._node.req.socket.once("close", () => { + const hasBody = !(this.method === "GET" || this.method === "HEAD"); + const target = hasBody + ? this._node.req.socket || this._node.req + : this._node.req; + target.once("close", () => { this.#abortSignal?.abort(); }); } From 35aaaca582f6704853a6eb485e31ca27d8d7a363 Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Tue, 14 Oct 2025 14:54:05 +0200 Subject: [PATCH 3/5] update --- src/adapters/_node/request.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/adapters/_node/request.ts b/src/adapters/_node/request.ts index 747b47aa..66e3ef09 100644 --- a/src/adapters/_node/request.ts +++ b/src/adapters/_node/request.ts @@ -85,13 +85,17 @@ export const NodeRequest: { get signal() { if (!this.#abortSignal) { this.#abortSignal = new AbortController(); - const hasBody = !(this.method === "GET" || this.method === "HEAD"); - const target = hasBody - ? this._node.req.socket || this._node.req - : this._node.req; - target.once("close", () => { + const req = this._node.req; + const method = this.method; + const abort = () => { this.#abortSignal?.abort(); - }); + }; + req.once("error", abort); + if (method === "GET" || method === "HEAD") { + req.once("close", abort); + } else { + req.once("end", abort); // wait for body to be consumed + } } return this.#abortSignal.signal; } From 88cad9811eb107ad9f6901f329997aa2174b6541 Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Tue, 14 Oct 2025 14:56:12 +0200 Subject: [PATCH 4/5] also pass proper reason --- src/adapters/_node/request.ts | 4 ++-- test/_tests.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/adapters/_node/request.ts b/src/adapters/_node/request.ts index 66e3ef09..1af5bcb9 100644 --- a/src/adapters/_node/request.ts +++ b/src/adapters/_node/request.ts @@ -87,8 +87,8 @@ export const NodeRequest: { this.#abortSignal = new AbortController(); const req = this._node.req; const method = this.method; - const abort = () => { - this.#abortSignal?.abort(); + const abort = (err?: any) => { + this.#abortSignal?.abort(err); }; req.once("error", abort); if (method === "GET" || method === "HEAD") { diff --git a/test/_tests.ts b/test/_tests.ts index d7ec9691..2e904567 100644 --- a/test/_tests.ts +++ b/test/_tests.ts @@ -121,7 +121,7 @@ export function addTests(opts: { const aborts = await fetch(url("/abort-log")).then((res) => res.json()); const abort = aborts.find((a: any) => a.request === "GET /abort"); expect(abort).toBeDefined(); - expect(abort.reason).toMatch(/AbortError:/); + expect(abort.reason).toMatch(/AbortError:|aborted/); }); test("total aborts", async () => { From 53ee68b57575a327358cfe7a0a5c6a90a128106a Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Tue, 14 Oct 2025 14:59:46 +0200 Subject: [PATCH 5/5] simplify --- src/adapters/_node/request.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/adapters/_node/request.ts b/src/adapters/_node/request.ts index 1af5bcb9..593514c9 100644 --- a/src/adapters/_node/request.ts +++ b/src/adapters/_node/request.ts @@ -86,16 +86,11 @@ export const NodeRequest: { if (!this.#abortSignal) { this.#abortSignal = new AbortController(); const req = this._node.req; - const method = this.method; const abort = (err?: any) => { this.#abortSignal?.abort(err); }; req.once("error", abort); - if (method === "GET" || method === "HEAD") { - req.once("close", abort); - } else { - req.once("end", abort); // wait for body to be consumed - } + req.once("end", abort); } return this.#abortSignal.signal; }