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:
Luigi Pinca 2018-01-17 15:44:49 +01:00 committed by Ruben Bridgewater
parent 08ada72cc6
commit 93f1d9e10b
No known key found for this signature in database
GPG Key ID: F07496B3EB3C1762
2 changed files with 34 additions and 1 deletions

View File

@ -420,6 +420,7 @@ function socketOnData(d) {
socket.removeListener('data', socketOnData);
socket.removeListener('end', socketOnEnd);
parser.finish();
freeParser(parser, req, socket);
var bodyHead = d.slice(bytesParsed, d.length);
@ -440,7 +441,6 @@ function socketOnData(d) {
// Got Upgrade header or CONNECT method, but have no handler.
socket.destroy();
}
freeParser(parser, req, socket);
} else if (parser.incoming && parser.incoming.complete &&
// When the status code is 100 (Continue), the server will
// send a final response after this client sends a request

View 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();
}));
}));