Skip to content

Commit d2f8222

Browse files
ZYSzysruyadorno
authored andcommitted
http2: support ALPNCallback option
PR-URL: #56187Fixes: #55994 Refs: #45190 Reviewed-By: Tim Perry <[email protected]> Reviewed-By: Juan José Arboleda <[email protected]> Reviewed-By: Luigi Pinca <[email protected]>
1 parent 9e98e86 commit d2f8222

File tree

2 files changed

+54
-3
lines changed

2 files changed

+54
-3
lines changed

‎lib/internal/http2/core.js‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3136,9 +3136,13 @@ function initializeOptions(options){
31363136

31373137
functioninitializeTLSOptions(options,servername){
31383138
options=initializeOptions(options);
3139-
options.ALPNProtocols=['h2'];
3140-
if(options.allowHTTP1===true)
3141-
options.ALPNProtocols.push('http/1.1');
3139+
3140+
if(!options.ALPNCallback){
3141+
options.ALPNProtocols=['h2'];
3142+
if(options.allowHTTP1===true)
3143+
options.ALPNProtocols.push('http/1.1');
3144+
}
3145+
31423146
if(servername!==undefined&&!options.servername)
31433147
options.servername=servername;
31443148
returnoptions;

‎test/parallel/test-http2-alpn.js‎

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
'use strict';
2+
constcommon=require('../common');
3+
constfixtures=require('../common/fixtures');
4+
5+
// This test verifies that http2 server support ALPNCallback option.
6+
7+
if(!common.hasCrypto)common.skip('missing crypto');
8+
9+
constassert=require('assert');
10+
consth2=require('http2');
11+
consttls=require('tls');
12+
13+
{
14+
// Server sets two incompatible ALPN options:
15+
assert.throws(()=>h2.createSecureServer({
16+
ALPNCallback: ()=>'a',
17+
ALPNProtocols: ['b','c']
18+
}),(error)=>error.code==='ERR_TLS_ALPN_CALLBACK_WITH_PROTOCOLS');
19+
}
20+
21+
{
22+
constserver=h2.createSecureServer({
23+
key: fixtures.readKey('rsa_private.pem'),
24+
cert: fixtures.readKey('rsa_cert.crt'),
25+
ALPNCallback: ()=>'a',
26+
});
27+
28+
server.on(
29+
'secureConnection',
30+
common.mustCall((socket)=>{
31+
assert.strictEqual(socket.alpnProtocol,'a');
32+
socket.end();
33+
server.close();
34+
})
35+
);
36+
37+
server.listen(0,function(){
38+
constclient=tls.connect({
39+
port: server.address().port,
40+
rejectUnauthorized: false,
41+
ALPNProtocols: ['a'],
42+
},common.mustCall(()=>{
43+
assert.strictEqual(client.alpnProtocol,'a');
44+
client.end();
45+
}));
46+
});
47+
}

0 commit comments

Comments
(0)