Skip to content

Commit b0ebd23

Browse files
ZYSzystargos
authored andcommitted
http2: support ALPNCallback option
PR-URL: #56187 Fixes: #55994 Refs: #45190 Reviewed-By: Tim Perry <pimterry@gmail.com> Reviewed-By: Juan José Arboleda <soyjuanarbol@gmail.com> Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
1 parent 77397c5 commit b0ebd23

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
function initializeTLSOptions(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
return options;

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+
const common = require('../common');
3+
const fixtures = 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+
const assert = require('assert');
10+
const h2 = require('http2');
11+
const tls = 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+
const server = 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+
const client = 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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy