diff --git a/lib/api/util.js b/lib/api/util.js index c5573bf3f8c..2f983bf424c 100644 --- a/lib/api/util.js +++ b/lib/api/util.js @@ -12,18 +12,25 @@ async function getResolveErrorBodyCallback ({ callback, body, contentType, statu let chunks = [] let length = 0 - for await (const chunk of body) { - chunks.push(chunk) - length += chunk.length - if (length > CHUNK_LIMIT) { - chunks = null - break + try { + for await (const chunk of body) { + chunks.push(chunk) + length += chunk.length + if (length > CHUNK_LIMIT) { + chunks = [] + length = 0 + break + } } + } catch { + chunks = [] + length = 0 + // Do nothing.... } const message = `Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}` - if (statusCode === 204 || !contentType || !chunks) { + if (statusCode === 204 || !contentType || !length) { queueMicrotask(() => callback(new ResponseStatusCodeError(message, statusCode, headers))) return } diff --git a/test/issue-3136.js b/test/issue-3136.js new file mode 100644 index 00000000000..163433cb119 --- /dev/null +++ b/test/issue-3136.js @@ -0,0 +1,21 @@ +const { request } = require('..') +const { test, after } = require('node:test') +const net = require('node:net') +const { once } = require('node:events') +const assert = require('node:assert') + +test('https://github.com/mcollina/undici/issues/3136', async (t) => { + const server = net.createServer((socket) => { + socket.write('HTTP/1.1 404 Not Found\r\n') + socket.write('Transfer-Encoding: chunked\r\n\r\n') + socket.write('\r\n') + }) + after(() => server.close()) + server.listen(0) + await once(server, 'listening') + await assert.rejects( + request(`http://localhost:${server.address().port}`, { + throwOnError: true + }) + ) +})