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.server.emit('clientError', e, this)) {
|
||||||
if (this.writable) {
|
if (this.writable) {
|
||||||
this.end(badRequestResponse);
|
this.write(badRequestResponse);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
this.destroy(e);
|
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