diff --git a/lib/_http_client.js b/lib/_http_client.js index 9e2ebca8ee5ca3..30ab9016844a1d 100644 --- a/lib/_http_client.js +++ b/lib/_http_client.js @@ -654,6 +654,11 @@ function parserOnIncomingClient(res, shouldKeepAlive) { if (method === 'HEAD') return 1; // Skip body but don't treat as Upgrade. + if (res.statusCode === 304) { + res.complete = true; + return 1; // Skip body as there won't be any + } + return 0; // No special treatment. } diff --git a/test/parallel/test-http-allow-content-length-304.js b/test/parallel/test-http-allow-content-length-304.js new file mode 100644 index 00000000000000..172733e73570d1 --- /dev/null +++ b/test/parallel/test-http-allow-content-length-304.js @@ -0,0 +1,32 @@ +'use strict'; +const common = require('../common'); + +// This test ensures that the http-parser doesn't expect a body when +// a 304 Not Modified response has a non-zero Content-Length header + +const assert = require('assert'); +const http = require('http'); + +const server = http.createServer(common.mustCall((req, res) => { + res.setHeader('Content-Length', 11); + res.statusCode = 304; + res.end(null); +})); + +server.listen(0, () => { + const request = http.request({ + port: server.address().port, + }); + + request.on('response', common.mustCall((response) => { + response.on('data', common.mustNotCall()); + response.on('aborted', common.mustNotCall()); + response.on('end', common.mustCall(() => { + assert.strictEqual(response.headers['content-length'], '11'); + assert.strictEqual(response.statusCode, 304); + server.close(); + })); + })); + + request.end(null); +});