diff --git a/lib/api/abort-signal.js b/lib/api/abort-signal.js index 2985c1efa96..3c15202ff44 100644 --- a/lib/api/abort-signal.js +++ b/lib/api/abort-signal.js @@ -6,9 +6,9 @@ const kSignal = Symbol('kSignal') function abort (self) { if (self.abort) { - self.abort() + self.abort(self[kSignal]?.reason) } else { - self.onError(new RequestAbortedError()) + self.onError(self[kSignal]?.reason ?? new RequestAbortedError()) } } diff --git a/test/issue-2349.js b/test/issue-2349.js index ae44543bb7a..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) @@ -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) } }) 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' } + ) +}) 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) diff --git a/test/node-test/abort-controller.js b/test/node-test/abort-controller.js index d4d9a588df6..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) }) }) @@ -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() @@ -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) }) }) })