diff --git a/doc/api/http.md b/doc/api/http.md index 05cf220ac06af7..e57c188925bb09 100644 --- a/doc/api/http.md +++ b/doc/api/http.md @@ -1309,8 +1309,9 @@ type other than {net.Socket}. Default behavior is to try close the socket with a HTTP '400 Bad Request', or a HTTP '431 Request Header Fields Too Large' in the case of a -[`HPE_HEADER_OVERFLOW`][] error. If the socket is not writable or has already -written data it is immediately destroyed. +[`HPE_HEADER_OVERFLOW`][] error. If the socket is not writable or headers +of the current attached [`http.ServerResponse`][] has been sent, it is +immediately destroyed. `socket` is the [`net.Socket`][] object that the error originated from. diff --git a/lib/_http_server.js b/lib/_http_server.js index 58e6f24696d9eb..a2247d3c008ae9 100644 --- a/lib/_http_server.js +++ b/lib/_http_server.js @@ -819,7 +819,11 @@ function socketOnError(e) { } if (!this.server.emit('clientError', e, this)) { - if (this.writable && this.bytesWritten === 0) { + // Caution must be taken to avoid corrupting the remote peer. + // Reply an error segment if there is no in-flight `ServerResponse`, + // or no data of the in-flight one has been written yet to this socket. + if (this.writable && + (!this._httpMessage || !this._httpMessage._headerSent)) { let response; switch (e.code) { diff --git a/test/parallel/test-http-server-headers-timeout-keepalive.js b/test/parallel/test-http-server-headers-timeout-keepalive.js index 1affc5a4befff4..32c9aec071e815 100644 --- a/test/parallel/test-http-server-headers-timeout-keepalive.js +++ b/test/parallel/test-http-server-headers-timeout-keepalive.js @@ -81,9 +81,7 @@ server.listen(0, common.mustCall(() => { assert.strictEqual(second, true); assert.strictEqual( response, - // Empty because of https://github.com/nodejs/node/commit/e8d7fedf7cad6e612e4f2e0456e359af57608ac7 - // 'HTTP/1.1 408 Request Timeout\r\nConnection: close\r\n\r\n' - '' + 'HTTP/1.1 408 Request Timeout\r\nConnection: close\r\n\r\n' ); server.close(); }); diff --git a/test/parallel/test-http-server-headers-timeout-pipelining.js b/test/parallel/test-http-server-headers-timeout-pipelining.js index bfd5af6bcefc1f..d0329a95cb19d4 100644 --- a/test/parallel/test-http-server-headers-timeout-pipelining.js +++ b/test/parallel/test-http-server-headers-timeout-pipelining.js @@ -56,9 +56,7 @@ server.listen(0, common.mustCall(() => { assert.strictEqual( response, - // Empty because of https://github.com/nodejs/node/commit/e8d7fedf7cad6e612e4f2e0456e359af57608ac7 - // 'HTTP/1.1 408 Request Timeout\r\nConnection: close\r\n\r\n' - '' + 'HTTP/1.1 408 Request Timeout\r\nConnection: close\r\n\r\n' ); server.close(); }); diff --git a/test/parallel/test-http-server-request-timeout-keepalive.js b/test/parallel/test-http-server-request-timeout-keepalive.js index 215d3dbc086ccb..a3f9bccc8deaa5 100644 --- a/test/parallel/test-http-server-request-timeout-keepalive.js +++ b/test/parallel/test-http-server-request-timeout-keepalive.js @@ -79,9 +79,7 @@ server.listen(0, common.mustCall(() => { assert.strictEqual(second, true); assert.strictEqual( response, - // Empty because of https://github.com/nodejs/node/commit/e8d7fedf7cad6e612e4f2e0456e359af57608ac7 - // 'HTTP/1.1 408 Request Timeout\r\nConnection: close\r\n\r\n' - '' + 'HTTP/1.1 408 Request Timeout\r\nConnection: close\r\n\r\n' ); server.close(); }); diff --git a/test/parallel/test-http-server-request-timeout-pipelining.js b/test/parallel/test-http-server-request-timeout-pipelining.js index e00840791a3773..0c7e87160fefc5 100644 --- a/test/parallel/test-http-server-request-timeout-pipelining.js +++ b/test/parallel/test-http-server-request-timeout-pipelining.js @@ -50,9 +50,7 @@ server.listen(0, common.mustCall(() => { assert.strictEqual( response, - // Empty because of https://github.com/nodejs/node/commit/e8d7fedf7cad6e612e4f2e0456e359af57608ac7 - // 'HTTP/1.1 408 Request Timeout\r\nConnection: close\r\n\r\n' - '' + 'HTTP/1.1 408 Request Timeout\r\nConnection: close\r\n\r\n' ); server.close(); });