From 663ad31320127a27da0a5e37a4ff48c03d6ac8c8 Mon Sep 17 00:00:00 2001 From: Khafra Date: Thu, 4 Jan 2024 11:46:02 -0500 Subject: [PATCH 1/6] abort request with reason if one is provided --- lib/api/abort-signal.js | 2 +- test/issue-2590.js | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 test/issue-2590.js diff --git a/lib/api/abort-signal.js b/lib/api/abort-signal.js index 2985c1efa96..f5ffd81502e 100644 --- a/lib/api/abort-signal.js +++ b/lib/api/abort-signal.js @@ -8,7 +8,7 @@ function abort (self) { if (self.abort) { self.abort() } else { - self.onError(new RequestAbortedError()) + self.onError(self[kSignal]?.reason ?? new RequestAbortedError()) } } diff --git a/test/issue-2590.js b/test/issue-2590.js new file mode 100644 index 00000000000..4f5b186dfd3 --- /dev/null +++ b/test/issue-2590.js @@ -0,0 +1,35 @@ +'use strict' + +const { test } = require('tap') +const { request } = require('..') +const { createServer } = require('http') +const { once } = require('events') + +test('aborting request with custom reason', async (t) => { + const server = createServer(() => {}).listen(0) + + t.teardown(server.close.bind(server)) + await once(server, 'listening') + + const timeout = AbortSignal.timeout(0) + const ac = new AbortController() + ac.abort(new Error('aborted')) + + const ac2 = new AbortController() + ac2.abort() // no reason + + await t.rejects( + request(`http://localhost:${server.address().port}`, { signal: timeout }), + timeout.reason + ) + + await t.rejects( + request(`http://localhost:${server.address().port}`, { signal: ac.signal }), + ac.signal.reason + ) + + await t.rejects( + request(`http://localhost:${server.address().port}`, { signal: ac2.signal }), + { code: 'UND_ERR_ABORTED' } + ) +}) From 4738be69fdda7383601d259d5f8fa95c2723f59a Mon Sep 17 00:00:00 2001 From: Khafra Date: Thu, 4 Jan 2024 12:05:31 -0500 Subject: [PATCH 2/6] fixup --- test/node-test/abort-controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/node-test/abort-controller.js b/test/node-test/abort-controller.js index d4d9a588df6..46a892a9b43 100644 --- a/test/node-test/abort-controller.js +++ b/test/node-test/abort-controller.js @@ -73,7 +73,7 @@ for (const { AbortControllerImpl, controllerName } of controllers) { }) client.request({ path: '/', method: 'GET', signal: abortController.signal }, (err, response) => { - p.ok(err instanceof errors.RequestAbortedError) + p.ok(err instanceof errors.RequestAbortedError || err instanceof DOMException) }) abortController.abort() From b6db8bcb32d5ae8feda8239b4fae68946d928218 Mon Sep 17 00:00:00 2001 From: Khafra Date: Thu, 4 Jan 2024 12:09:24 -0500 Subject: [PATCH 3/6] fixup --- lib/api/abort-signal.js | 2 +- test/node-test/abort-controller.js | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/api/abort-signal.js b/lib/api/abort-signal.js index f5ffd81502e..3c15202ff44 100644 --- a/lib/api/abort-signal.js +++ b/lib/api/abort-signal.js @@ -6,7 +6,7 @@ const kSignal = Symbol('kSignal') function abort (self) { if (self.abort) { - self.abort() + self.abort(self[kSignal]?.reason) } else { self.onError(self[kSignal]?.reason ?? new RequestAbortedError()) } diff --git a/test/node-test/abort-controller.js b/test/node-test/abort-controller.js index 46a892a9b43..4d1111e9cce 100644 --- a/test/node-test/abort-controller.js +++ b/test/node-test/abort-controller.js @@ -36,7 +36,7 @@ for (const { AbortControllerImpl, controllerName } of controllers) { abortController.abort() client.request({ path: '/', method: 'GET', signal: abortController.signal }, (err, response) => { - p.ok(err instanceof errors.RequestAbortedError) + p.ok(err instanceof errors.RequestAbortedError || err instanceof DOMException) }) }) @@ -98,7 +98,7 @@ for (const { AbortControllerImpl, controllerName } of controllers) { t.after(client.destroy.bind(client)) client.request({ path: '/', method: 'GET', signal: abortController.signal }, (err, response) => { - p.ok(err instanceof errors.RequestAbortedError) + p.ok(err instanceof errors.RequestAbortedError || err instanceof DOMException) }) }) @@ -122,7 +122,7 @@ for (const { AbortControllerImpl, controllerName } of controllers) { t.after(client.destroy.bind(client)) client.request({ path: '/', method: 'GET', signal: abortController.signal }, (err, response) => { - p.ok(err instanceof errors.RequestAbortedError) + p.ok(err instanceof errors.RequestAbortedError || err instanceof DOMException) }) }) @@ -149,7 +149,7 @@ for (const { AbortControllerImpl, controllerName } of controllers) { abortController.abort() }) response.body.on('error', err => { - p.ok(err instanceof errors.RequestAbortedError) + p.ok(err instanceof errors.RequestAbortedError || err instanceof DOMException) }) }) }) @@ -174,7 +174,7 @@ for (const { AbortControllerImpl, controllerName } of controllers) { t.after(client.destroy.bind(client)) client.request({ path: '/', method: 'POST', body, signal: abortController.signal }, (err, response) => { - p.ok(err instanceof errors.RequestAbortedError) + p.ok(err instanceof errors.RequestAbortedError || err instanceof DOMException) }) }) await p.completed @@ -204,7 +204,7 @@ for (const { AbortControllerImpl, controllerName } of controllers) { t.after(client.destroy.bind(client)) client.request({ path: '/', method: 'POST', body, signal: abortController.signal }, (err, response) => { - p.ok(err instanceof errors.RequestAbortedError) + p.ok(err instanceof errors.RequestAbortedError || err instanceof DOMException) }) }) await p.completed @@ -237,7 +237,7 @@ for (const { AbortControllerImpl, controllerName } of controllers) { abortController.abort() }) response.body.on('error', err => { - p.ok(err instanceof errors.RequestAbortedError) + p.ok(err instanceof errors.RequestAbortedError || err instanceof DOMException) }) }) }) From 5d6281a0d46034d3a676817de5b4c17ca46cffa5 Mon Sep 17 00:00:00 2001 From: Khafra Date: Thu, 4 Jan 2024 12:16:11 -0500 Subject: [PATCH 4/6] fixup --- test/issue-2349.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/issue-2349.js b/test/issue-2349.js index ae44543bb7a..f0a1e7fa95b 100644 --- a/test/issue-2349.js +++ b/test/issue-2349.js @@ -21,7 +21,7 @@ test('stream() does not fail after request has been aborted', async (t) => { const parts = [] const ac = new AbortController() - setTimeout(() => ac.abort('nevermind'), 5) + setTimeout(() => ac.abort(), 5) try { await stream( @@ -42,6 +42,6 @@ test('stream() does not fail after request has been aborted', async (t) => { ) } catch (error) { console.log(error) - t.equal(error instanceof errors.RequestAbortedError, true) + t.equal(error instanceof DOMException, true) } }) From 1c10492f3da80400aef6339afe9fd182b51c3567 Mon Sep 17 00:00:00 2001 From: Khafra Date: Thu, 4 Jan 2024 12:18:29 -0500 Subject: [PATCH 5/6] fixup --- test/issue-2349.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/issue-2349.js b/test/issue-2349.js index f0a1e7fa95b..e8741a428a1 100644 --- a/test/issue-2349.js +++ b/test/issue-2349.js @@ -2,7 +2,7 @@ const { test } = require('tap') const { Writable } = require('stream') -const { MockAgent, errors, stream } = require('..') +const { MockAgent, stream } = require('..') test('stream() does not fail after request has been aborted', async (t) => { t.plan(1) From cca97ad0a2c7d24d5994dc9cd276ba8737b72aa3 Mon Sep 17 00:00:00 2001 From: Khafra Date: Thu, 4 Jan 2024 12:29:36 -0500 Subject: [PATCH 6/6] fixup --- test/jest/mock-scope.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/jest/mock-scope.test.js b/test/jest/mock-scope.test.js index f0b2378cbea..e841e48c473 100644 --- a/test/jest/mock-scope.test.js +++ b/test/jest/mock-scope.test.js @@ -25,5 +25,5 @@ it('Jest works with MockScope.delay - issue #1327', async () => { signal: ac.signal }) - await expect(promise).rejects.toThrowError('Request aborted') + await expect(promise).rejects.toThrowError('This operation was aborted') }, 1000)