http: destroy the socket on parse error
Destroy the socket if the `'clientError'` event is emitted and there is no listener for it. Fixes: https://github.com/nodejs/node/issues/24586 PR-URL: https://github.com/nodejs/node/pull/24757 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
This commit is contained in:
parent
9159fb733c
commit
ff7d053ae6
@ -512,8 +512,7 @@ function socketOnError(e) {
|
||||
|
||||
if (!this.server.emit('clientError', e, this)) {
|
||||
if (this.writable) {
|
||||
this.end(badRequestResponse);
|
||||
return;
|
||||
this.write(badRequestResponse);
|
||||
}
|
||||
this.destroy(e);
|
||||
}
|
||||
|
@ -0,0 +1,45 @@
|
||||
'use strict';
|
||||
|
||||
const { expectsError, mustCall } = require('../common');
|
||||
|
||||
// Test that the request socket is destroyed if the `'clientError'` event is
|
||||
// emitted and there is no listener for it.
|
||||
|
||||
const assert = require('assert');
|
||||
const { createServer } = require('http');
|
||||
const { createConnection } = require('net');
|
||||
|
||||
const server = createServer();
|
||||
|
||||
server.on('connection', mustCall((socket) => {
|
||||
socket.on('error', expectsError({
|
||||
type: Error,
|
||||
message: 'Parse Error',
|
||||
code: 'HPE_INVALID_METHOD',
|
||||
bytesParsed: 0,
|
||||
rawPacket: Buffer.from('FOO /\r\n')
|
||||
}));
|
||||
}));
|
||||
|
||||
server.listen(0, () => {
|
||||
const chunks = [];
|
||||
const socket = createConnection({
|
||||
allowHalfOpen: true,
|
||||
port: server.address().port
|
||||
});
|
||||
|
||||
socket.on('connect', mustCall(() => {
|
||||
socket.write('FOO /\r\n');
|
||||
}));
|
||||
|
||||
socket.on('data', (chunk) => {
|
||||
chunks.push(chunk);
|
||||
});
|
||||
|
||||
socket.on('end', mustCall(() => {
|
||||
const expected = Buffer.from('HTTP/1.1 400 Bad Request\r\n\r\n');
|
||||
assert(Buffer.concat(chunks).equals(expected));
|
||||
|
||||
server.close();
|
||||
}));
|
||||
});
|
Loading…
x
Reference in New Issue
Block a user