From 977b0ed8654ed34c345c4be6ebb072f36ea6be97 Mon Sep 17 00:00:00 2001 From: Arnaud Lefebvre Date: Tue, 18 Aug 2020 21:28:31 +0200 Subject: [PATCH] http: allow Content-Length header for 304 responses Fixes: https://github.com/nodejs/node/issues/31037 PR-URL: https://github.com/nodejs/node/pull/34835 Reviewed-By: James M Snell Reviewed-By: Ricky Zhou <0x19951125@gmail.com> Reviewed-By: Trivikram Kamat --- lib/_http_client.js | 5 +++ .../test-http-allow-content-length-304.js | 32 +++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 test/parallel/test-http-allow-content-length-304.js diff --git a/lib/_http_client.js b/lib/_http_client.js index d19fa7c68107c7..320ab7dcb996ba 100644 --- a/lib/_http_client.js +++ b/lib/_http_client.js @@ -643,6 +643,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); +});