diff --git a/lib/_http_server.js b/lib/_http_server.js index c5681725ca5401..f511e38c801f84 100644 --- a/lib/_http_server.js +++ b/lib/_http_server.js @@ -1102,6 +1102,22 @@ function parserOnIncoming(server, socket, state, req, keepAlive) { }); } + if (req.method === 'HEAD' || req.method === 'GET') { + // Fast dump where request "has" already emitted all lifecycle events. + // This avoids a lot of unnecessary overhead otherwise introduced by + // stream.Readable life cycle rules. The downside is that this will + // break some servers that read GET bodies. + + req._dumped = true; + req._readableState.ended = true; + req._readableState.endEmitted = true; + req._readableState.destroyed = true; + req._readableState.closed = true; + req._readableState.closeEmitted = true; + + req._read(); + } + if (socket._httpMessage) { // There are already pending outgoing res, append. state.outgoing.push(res); diff --git a/test/parallel/test-http-chunk-extensions-limit.js b/test/parallel/test-http-chunk-extensions-limit.js index a9adacac5e7303..115c5e61fd3e16 100644 --- a/test/parallel/test-http-chunk-extensions-limit.js +++ b/test/parallel/test-http-chunk-extensions-limit.js @@ -124,7 +124,7 @@ const assert = require('assert'); })); sock.end('' + - 'GET / HTTP/1.1\r\n' + + 'PUT / HTTP/1.1\r\n' + `Host: localhost:${port}\r\n` + 'Transfer-Encoding: chunked\r\n\r\n' + '2;' + 'A'.repeat(10000) + '=bar\r\nAA\r\n' + diff --git a/test/parallel/test-http.js b/test/parallel/test-http.js index 366fb42d1569d9..4cbb79ccbe5aed 100644 --- a/test/parallel/test-http.js +++ b/test/parallel/test-http.js @@ -52,12 +52,18 @@ const server = http.Server(common.mustCall((req, res) => { if (expectedRequests.length === 0) server.close(); - req.on('end', () => { + if (req.readableEnded) { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.write(`The path was ${url.parse(req.url).pathname}`); res.end(); - }); - req.resume(); + } else { + req.on('end', () => { + res.writeHead(200, { 'Content-Type': 'text/plain' }); + res.write(`The path was ${url.parse(req.url).pathname}`); + res.end(); + }); + req.resume(); + } }, 3)); server.listen(0);