diff --git a/lib/api/api-request.js b/lib/api/api-request.js index f70f351f2dc..e13c6ec7f90 100644 --- a/lib/api/api-request.js +++ b/lib/api/api-request.js @@ -44,6 +44,7 @@ class RequestHandler extends AsyncResource { throw err } + this.method = method this.responseHeaders = responseHeaders || null this.opaque = opaque || null this.callback = callback @@ -110,8 +111,15 @@ class RequestHandler extends AsyncResource { const parsedHeaders = responseHeaders === 'raw' ? util.parseHeaders(rawHeaders) : headers const contentType = parsedHeaders['content-type'] - const contentLength = parsedHeaders['content-length'] - const body = new Readable({ resume, abort, contentType, contentLength, highWaterMark }) + const body = new Readable({ + resume, + abort, + contentType, + contentLength: this.method !== 'HEAD' && parsedHeaders['content-length'] + ? Number(parsedHeaders['content-length']) + : null, + highWaterMark + }) if (this.removeAbortListener) { // TODO (fix): 'close' is sufficient but breaks tests. diff --git a/test/client-request.js b/test/client-request.js index 2bd38201a72..8cbad5ccb48 100644 --- a/test/client-request.js +++ b/test/client-request.js @@ -14,6 +14,39 @@ const { promisify } = require('node:util') const { NotSupportedError, InvalidArgumentError } = require('../lib/core/errors') const { parseFormDataString } = require('./utils/formdata') +test('request dump head', async (t) => { + t = tspl(t, { plan: 3 }) + + const server = createServer((req, res) => { + res.setHeader('content-length', 5 * 100) + res.flushHeaders() + res.write('hello'.repeat(100)) + }) + after(() => server.close()) + + server.listen(0, () => { + const client = new Client(`http://localhost:${server.address().port}`) + after(() => client.destroy()) + + let dumped = false + client.on('disconnect', () => { + t.strictEqual(dumped, true) + }) + client.request({ + path: '/', + method: 'HEAD' + }, (err, { body }) => { + t.ifError(err) + body.dump({ limit: 1 }).then(() => { + dumped = true + t.ok(true, 'pass') + }) + }) + }) + + await t.completed +}) + test('request dump big', async (t) => { t = tspl(t, { plan: 3 })