11cb0ef41Sopenharmony_ci'use strict';
21cb0ef41Sopenharmony_ci
31cb0ef41Sopenharmony_ciconst common = require('../common');
41cb0ef41Sopenharmony_ciif (!common.hasCrypto)
51cb0ef41Sopenharmony_ci  common.skip('missing crypto');
61cb0ef41Sopenharmony_ciconst assert = require('assert');
71cb0ef41Sopenharmony_ciconst h2 = require('http2');
81cb0ef41Sopenharmony_ci
91cb0ef41Sopenharmony_ci// Requests using host instead of :authority should be allowed
101cb0ef41Sopenharmony_ci// and Http2ServerRequest.authority should fall back to host
111cb0ef41Sopenharmony_ci
121cb0ef41Sopenharmony_ci// :authority should NOT be auto-filled if host is present
131cb0ef41Sopenharmony_ci
141cb0ef41Sopenharmony_ciconst server = h2.createServer();
151cb0ef41Sopenharmony_ciserver.listen(0, common.mustCall(function() {
161cb0ef41Sopenharmony_ci  const port = server.address().port;
171cb0ef41Sopenharmony_ci  server.once('request', common.mustCall(function(request, response) {
181cb0ef41Sopenharmony_ci    const expected = {
191cb0ef41Sopenharmony_ci      ':path': '/foobar',
201cb0ef41Sopenharmony_ci      ':method': 'GET',
211cb0ef41Sopenharmony_ci      ':scheme': 'http',
221cb0ef41Sopenharmony_ci      'host': `localhost:${port}`
231cb0ef41Sopenharmony_ci    };
241cb0ef41Sopenharmony_ci
251cb0ef41Sopenharmony_ci    assert.strictEqual(request.authority, expected.host);
261cb0ef41Sopenharmony_ci
271cb0ef41Sopenharmony_ci    const headers = request.headers;
281cb0ef41Sopenharmony_ci    for (const [name, value] of Object.entries(expected)) {
291cb0ef41Sopenharmony_ci      assert.strictEqual(headers[name], value);
301cb0ef41Sopenharmony_ci    }
311cb0ef41Sopenharmony_ci
321cb0ef41Sopenharmony_ci    const rawHeaders = request.rawHeaders;
331cb0ef41Sopenharmony_ci    for (const [name, value] of Object.entries(expected)) {
341cb0ef41Sopenharmony_ci      const position = rawHeaders.indexOf(name);
351cb0ef41Sopenharmony_ci      assert.notStrictEqual(position, -1);
361cb0ef41Sopenharmony_ci      assert.strictEqual(rawHeaders[position + 1], value);
371cb0ef41Sopenharmony_ci    }
381cb0ef41Sopenharmony_ci
391cb0ef41Sopenharmony_ci    assert(!Object.hasOwn(headers, ':authority'));
401cb0ef41Sopenharmony_ci    assert(!Object.hasOwn(rawHeaders, ':authority'));
411cb0ef41Sopenharmony_ci
421cb0ef41Sopenharmony_ci    response.on('finish', common.mustCall(function() {
431cb0ef41Sopenharmony_ci      server.close();
441cb0ef41Sopenharmony_ci    }));
451cb0ef41Sopenharmony_ci    response.end();
461cb0ef41Sopenharmony_ci  }));
471cb0ef41Sopenharmony_ci
481cb0ef41Sopenharmony_ci  const url = `http://localhost:${port}`;
491cb0ef41Sopenharmony_ci  const client = h2.connect(url, common.mustCall(function() {
501cb0ef41Sopenharmony_ci    const headers = {
511cb0ef41Sopenharmony_ci      ':path': '/foobar',
521cb0ef41Sopenharmony_ci      ':method': 'GET',
531cb0ef41Sopenharmony_ci      ':scheme': 'http',
541cb0ef41Sopenharmony_ci      'host': `localhost:${port}`
551cb0ef41Sopenharmony_ci    };
561cb0ef41Sopenharmony_ci    const request = client.request(headers);
571cb0ef41Sopenharmony_ci    request.on('end', common.mustCall(function() {
581cb0ef41Sopenharmony_ci      client.close();
591cb0ef41Sopenharmony_ci    }));
601cb0ef41Sopenharmony_ci    request.end();
611cb0ef41Sopenharmony_ci    request.resume();
621cb0ef41Sopenharmony_ci  }));
631cb0ef41Sopenharmony_ci}));
64