Skip to content

Commit 0250e1b

Browse files
lpincaevanlucas
authored andcommitted
http: free the parser before emitting 'upgrade'
Ensure that the parser is freed before emitting the 'connect' or 'upgrade' event. PR-URL: #18209 Reviewed-By: James M Snell <[email protected]> Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Jon Moss <[email protected]> Reviewed-By: Fedor Indutny <[email protected]> Reviewed-By: Ruben Bridgewater <[email protected]>
1 parent 01599e2 commit 0250e1b

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

lib/_http_client.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,7 @@ function socketOnData(d) {
452452
socket.removeListener('data', socketOnData);
453453
socket.removeListener('end', socketOnEnd);
454454
parser.finish();
455+
freeParser(parser, req, socket);
455456

456457
var bodyHead = d.slice(bytesParsed, d.length);
457458

@@ -472,7 +473,6 @@ function socketOnData(d) {
472473
// Got Upgrade header or CONNECT method, but have no handler.
473474
socket.destroy();
474475
}
475-
freeParser(parser, req, socket);
476476
} else if (parser.incoming && parser.incoming.complete &&
477477
// When the status code is 100 (Continue), the server will
478478
// send a final response after this client sends a request
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
'use strict';
2+
3+
const common = require('../common');
4+
const assert = require('assert');
5+
const http = require('http');
6+
7+
const server = http.createServer();
8+
9+
server.on('upgrade', common.mustCall((request, socket) => {
10+
assert.strictEqual(socket.parser, null);
11+
socket.write([
12+
'HTTP/1.1 101 Switching Protocols',
13+
'Connection: Upgrade',
14+
'Upgrade: WebSocket',
15+
'\r\n'
16+
].join('\r\n'));
17+
}));
18+
19+
server.listen(common.mustCall(() => {
20+
const request = http.get({
21+
port: server.address().port,
22+
headers: {
23+
Connection: 'Upgrade',
24+
Upgrade: 'WebSocket'
25+
}
26+
});
27+
28+
request.on('upgrade', common.mustCall((response, socket) => {
29+
assert.strictEqual(socket.parser, null);
30+
socket.destroy();
31+
server.close();
32+
}));
33+
}));

0 commit comments

Comments
 (0)