Skip to content

Commit 429113e

Browse files
mmomtchevdanielleadams
authored andcommitted
http2: move events to the JSStreamSocket
When using a JSStreamSocket, the HTTP2Session constructor will replace the socket object http2 events should be attached to the JSStreamSocket object because the http2 session handle lives there Fixes: #35695 PR-URL: #35772 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Ricky Zhou <0x19951125@gmail.com>
1 parent 06cc400 commit 429113e

2 files changed

Lines changed: 61 additions & 3 deletions

File tree

‎lib/internal/http2/core.js‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3132,11 +3132,14 @@ function connect(authority, options, listener) {
31323132
}
31333133
}
31343134

3135-
socket.on('error',socketOnError);
3136-
socket.on('close',socketOnClose);
3137-
31383135
constsession=newClientHttp2Session(options,socket);
31393136

3137+
// ClientHttp2Session may create a new socket object
3138+
// when socket is a JSSocket (socket != kSocket)
3139+
// https://github.com/nodejs/node/issues/35695
3140+
session[kSocket].on('error',socketOnError);
3141+
session[kSocket].on('close',socketOnClose);
3142+
31403143
session[kAuthority]=`${options.servername||host}:${port}`;
31413144
session[kProtocol]=protocol;
31423145

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
'use strict';
2+
3+
constcommon=require('../common');
4+
if(!common.hasCrypto)
5+
common.skip('missing crypto');
6+
consth2=require('http2');
7+
consttls=require('tls');
8+
constfixtures=require('../common/fixtures');
9+
const{ Duplex }=require('stream');
10+
11+
constserver=h2.createSecureServer({
12+
key: fixtures.readKey('agent1-key.pem'),
13+
cert: fixtures.readKey('agent1-cert.pem')
14+
});
15+
16+
classJSSocketextendsDuplex{
17+
constructor(socket){
18+
super({emitClose: true});
19+
socket.on('close',()=>this.destroy());
20+
socket.on('data',(data)=>this.push(data));
21+
this.socket=socket;
22+
}
23+
24+
_write(data,encoding,callback){
25+
this.socket.write(data,encoding,callback);
26+
}
27+
28+
_read(size){
29+
}
30+
31+
_final(cb){
32+
cb();
33+
}
34+
}
35+
36+
server.listen(0,common.mustCall(function(){
37+
constsocket=tls.connect({
38+
rejectUnauthorized: false,
39+
host: 'localhost',
40+
port: this.address().port,
41+
ALPNProtocols: ['h2']
42+
},()=>{
43+
constproxy=newJSSocket(socket);
44+
constclient=h2.connect(`https://localhost:${this.address().port}`,{
45+
createConnection: ()=>proxy
46+
});
47+
constreq=client.request();
48+
49+
setTimeout(()=>socket.destroy(),200);
50+
setTimeout(()=>client.close(),400);
51+
setTimeout(()=>server.close(),600);
52+
53+
req.on('close',common.mustCall(()=>{}));
54+
});
55+
}));

0 commit comments

Comments
 (0)