http: free the parser before emitting 'upgrade'
Ensure that the parser is freed before emitting the 'connect' or 'upgrade' event. PR-URL: https://github.com/nodejs/node/pull/18209 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Jon Moss <me@jonathanmoss.me> Reviewed-By: Fedor Indutny <fedor.indutny@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
This commit is contained in:
parent
08ada72cc6
commit
93f1d9e10b
@ -420,6 +420,7 @@ function socketOnData(d) {
|
|||||||
socket.removeListener('data', socketOnData);
|
socket.removeListener('data', socketOnData);
|
||||||
socket.removeListener('end', socketOnEnd);
|
socket.removeListener('end', socketOnEnd);
|
||||||
parser.finish();
|
parser.finish();
|
||||||
|
freeParser(parser, req, socket);
|
||||||
|
|
||||||
var bodyHead = d.slice(bytesParsed, d.length);
|
var bodyHead = d.slice(bytesParsed, d.length);
|
||||||
|
|
||||||
@ -440,7 +441,6 @@ function socketOnData(d) {
|
|||||||
// Got Upgrade header or CONNECT method, but have no handler.
|
// Got Upgrade header or CONNECT method, but have no handler.
|
||||||
socket.destroy();
|
socket.destroy();
|
||||||
}
|
}
|
||||||
freeParser(parser, req, socket);
|
|
||||||
} else if (parser.incoming && parser.incoming.complete &&
|
} else if (parser.incoming && parser.incoming.complete &&
|
||||||
// When the status code is 100 (Continue), the server will
|
// When the status code is 100 (Continue), the server will
|
||||||
// send a final response after this client sends a request
|
// send a final response after this client sends a request
|
||||||
|
33
test/parallel/test-http-parser-freed-before-upgrade.js
Normal file
33
test/parallel/test-http-parser-freed-before-upgrade.js
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const common = require('../common');
|
||||||
|
const assert = require('assert');
|
||||||
|
const http = require('http');
|
||||||
|
|
||||||
|
const server = http.createServer();
|
||||||
|
|
||||||
|
server.on('upgrade', common.mustCall((request, socket) => {
|
||||||
|
assert.strictEqual(socket.parser, null);
|
||||||
|
socket.write([
|
||||||
|
'HTTP/1.1 101 Switching Protocols',
|
||||||
|
'Connection: Upgrade',
|
||||||
|
'Upgrade: WebSocket',
|
||||||
|
'\r\n'
|
||||||
|
].join('\r\n'));
|
||||||
|
}));
|
||||||
|
|
||||||
|
server.listen(common.mustCall(() => {
|
||||||
|
const request = http.get({
|
||||||
|
port: server.address().port,
|
||||||
|
headers: {
|
||||||
|
Connection: 'Upgrade',
|
||||||
|
Upgrade: 'WebSocket'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
request.on('upgrade', common.mustCall((response, socket) => {
|
||||||
|
assert.strictEqual(socket.parser, null);
|
||||||
|
socket.destroy();
|
||||||
|
server.close();
|
||||||
|
}));
|
||||||
|
}));
|
Loading…
x
Reference in New Issue
Block a user