From c957b0517766729f931a1ef7ab134f75d6a01864 Mon Sep 17 00:00:00 2001 From: Yann Hamon Date: Wed, 6 Mar 2019 12:07:47 +0100 Subject: [PATCH] http: send connection: close when closing conn HTTP/1.1 mandates connections which do not support keep-alive and close the connection send the connection: close header, see https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.10 This page also provides more information: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Connection I understand that HTTP/1.1 defaults to keep-alive - and that the Connection: close header is required when closing a connection. This adds the Connection: close header in the 400 and 414 responses sent on client errors. PR-URL: https://github.com/nodejs/node/pull/26467 Reviewed-By: Ruben Bridgewater Reviewed-By: Luigi Pinca --- lib/_http_server.js | 6 ++++-- test/parallel/test-http-blank-header.js | 4 +++- test/parallel/test-http-header-overflow.js | 3 ++- .../test-http-server-destroy-socket-on-client-error.js | 4 +++- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/lib/_http_server.js b/lib/_http_server.js index 25917532e6f..7c2798cc9a0 100644 --- a/lib/_http_server.js +++ b/lib/_http_server.js @@ -506,10 +506,12 @@ function onParserExecute(server, socket, parser, state, ret) { const noop = () => {}; const badRequestResponse = Buffer.from( - `HTTP/1.1 400 ${STATUS_CODES[400]}${CRLF}${CRLF}`, 'ascii' + `HTTP/1.1 400 ${STATUS_CODES[400]}${CRLF}` + + `Connection: close${CRLF}${CRLF}`, 'ascii' ); const requestHeaderFieldsTooLargeResponse = Buffer.from( - `HTTP/1.1 431 ${STATUS_CODES[431]}${CRLF}${CRLF}`, 'ascii' + `HTTP/1.1 431 ${STATUS_CODES[431]}${CRLF}` + + `Connection: close${CRLF}${CRLF}`, 'ascii' ); function socketOnError(e) { // Ignore further errors diff --git a/test/parallel/test-http-blank-header.js b/test/parallel/test-http-blank-header.js index fd447b46d21..696b16f4995 100644 --- a/test/parallel/test-http-blank-header.js +++ b/test/parallel/test-http-blank-header.js @@ -52,7 +52,9 @@ server.listen(0, common.mustCall(() => { received += data.toString(); })); c.on('end', common.mustCall(() => { - assert.strictEqual(received, 'HTTP/1.1 400 Bad Request\r\n\r\n'); + assert.strictEqual(received, + 'HTTP/1.1 400 Bad Request\r\n' + + 'Connection: close\r\n\r\n'); c.end(); })); c.on('close', common.mustCall(() => server.close())); diff --git a/test/parallel/test-http-header-overflow.js b/test/parallel/test-http-header-overflow.js index a9bf5cbfa08..167dada9288 100644 --- a/test/parallel/test-http-header-overflow.js +++ b/test/parallel/test-http-header-overflow.js @@ -39,7 +39,8 @@ server.listen(0, mustCall(() => { c.on('end', mustCall(() => { assert.strictEqual( received, - 'HTTP/1.1 431 Request Header Fields Too Large\r\n\r\n' + 'HTTP/1.1 431 Request Header Fields Too Large\r\n' + + 'Connection: close\r\n\r\n' ); c.end(); })); diff --git a/test/parallel/test-http-server-destroy-socket-on-client-error.js b/test/parallel/test-http-server-destroy-socket-on-client-error.js index 9d513641833..70854018839 100644 --- a/test/parallel/test-http-server-destroy-socket-on-client-error.js +++ b/test/parallel/test-http-server-destroy-socket-on-client-error.js @@ -37,7 +37,9 @@ server.listen(0, () => { }); socket.on('end', mustCall(() => { - const expected = Buffer.from('HTTP/1.1 400 Bad Request\r\n\r\n'); + const expected = Buffer.from( + 'HTTP/1.1 400 Bad Request\r\nConnection: close\r\n\r\n' + ); assert(Buffer.concat(chunks).equals(expected)); server.close();