Skip to content

Commit f2f391e

Browse files
mog422addaleax
authored andcommitted
http: send 400 bad request on parse error
A web server such as nginx assumes that upstream is dead if upstream closes the socket without any response. PR-URL: #15324 Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: Ali Ijaz Sheikh <[email protected]> Reviewed-By: Franziska Hinkelmann <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Myles Borins <[email protected]> Reviewed-By: Evan Lucas <[email protected]> Reviewed-By: Sakthipriyan Vairamani <[email protected]> Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Jeremiah Senkpiel <[email protected]> Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: Joyee Cheung <[email protected]> Reviewed-By: Ruben Bridgewater <[email protected]> Reviewed-By: Michael Dawson <[email protected]>
1 parent d6ba14e commit f2f391e

File tree

2 files changed

+18
-3
lines changed

2 files changed

+18
-3
lines changed

lib/_http_server.js

+10-1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ const {
3838
const { OutgoingMessage } = require('_http_outgoing');
3939
const { outHeadersKey, ondrain } = require('internal/http');
4040
const errors = require('internal/errors');
41+
const Buffer = require('buffer').Buffer;
4142

4243
const STATUS_CODES = {
4344
100: 'Continue',
@@ -451,13 +452,21 @@ function onParserExecute(server, socket, parser, state, ret, d) {
451452
onParserExecuteCommon(server, socket, parser, state, ret, undefined);
452453
}
453454

455+
const badRequestResponse = Buffer.from(
456+
'HTTP/1.1 400 ' + STATUS_CODES[400] + CRLF + CRLF, 'ascii'
457+
);
454458
function socketOnError(e) {
455459
// Ignore further errors
456460
this.removeListener('error', socketOnError);
457461
this.on('error', () => {});
458462

459-
if (!this.server.emit('clientError', e, this))
463+
if (!this.server.emit('clientError', e, this)) {
464+
if (this.writable) {
465+
this.end(badRequestResponse);
466+
return;
467+
}
460468
this.destroy(e);
469+
}
461470
}
462471

463472
function onParserExecuteCommon(server, socket, parser, state, ret, d) {

test/parallel/test-http-blank-header.js

+8-2
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ const server = http.createServer(common.mustCall((req, res) => {
3838

3939
server.listen(0, common.mustCall(() => {
4040
const c = net.createConnection(server.address().port);
41+
let received = '';
4142

4243
c.on('connect', common.mustCall(() => {
4344
c.write('GET /blah HTTP/1.1\r\n' +
@@ -47,7 +48,12 @@ server.listen(0, common.mustCall(() => {
4748
'\r\n\r\nhello world'
4849
);
4950
}));
50-
51-
c.on('end', common.mustCall(() => c.end()));
51+
c.on('data', common.mustCall((data) => {
52+
received += data.toString();
53+
}));
54+
c.on('end', common.mustCall(() => {
55+
assert.strictEqual('HTTP/1.1 400 Bad Request\r\n\r\n', received);
56+
c.end();
57+
}));
5258
c.on('close', common.mustCall(() => server.close()));
5359
}));

0 commit comments

Comments
 (0)