◐ Shell
clean mode source ↗

http2: omit server name when HTTP2 host is IP address · nodejs/node@4c24ef8

1+

'use strict';

2+3+

const common = require('../common');

4+

if (!common.hasCrypto) { common.skip('missing crypto'); }

5+

const assert = require('assert');

6+

const fixtures = require('../common/fixtures');

7+

const h2 = require('http2');

8+9+

function loadKey(keyname) {

10+

return fixtures.readKey(keyname, 'binary');

11+

}

12+13+

const key = loadKey('agent8-key.pem');

14+

const cert = fixtures.readKey('agent8-cert.pem');

15+16+

const server = h2.createSecureServer({ key, cert });

17+

const hasIPv6 = common.hasIPv6;

18+

const testCount = hasIPv6 ? 2 : 1;

19+20+

server.on('stream', common.mustCall((stream) => {

21+

const session = stream.session;

22+

assert.strictEqual(session.servername, undefined);

23+

stream.respond({ 'content-type': 'application/json' });

24+

stream.end(JSON.stringify({

25+

servername: session.servername,

26+

originSet: session.originSet

27+

})

28+

);

29+

}, testCount));

30+31+

let done = 0;

32+33+

server.listen(0, common.mustCall(() => {

34+

function handleRequest(url) {

35+

const client = h2.connect(url,

36+

{ rejectUnauthorized: false });

37+

const req = client.request();

38+

let data = '';

39+

req.setEncoding('utf8');

40+

req.on('data', (d) => data += d);

41+

req.on('end', common.mustCall(() => {

42+

const originSet = req.session.originSet;

43+

assert.strictEqual(originSet[0], url);

44+

client.close();

45+

if (++done === testCount) server.close();

46+

}));

47+

}

48+49+

const ipv4Url = `https://127.0.0.1:${server.address().port}`;

50+

const ipv6Url = `https://[::1]:${server.address().port}`;

51+

handleRequest(ipv4Url);

52+

if (hasIPv6) handleRequest(ipv6Url);

53+

}));