1'use strict';
2
3const common = require('../common');
4if (!common.hasCrypto)
5  common.skip('missing crypto');
6const http2 = require('http2');
7const assert = require('assert');
8const {
9  DEFAULT_SETTINGS_MAX_HEADER_LIST_SIZE,
10  NGHTTP2_CANCEL,
11} = http2.constants;
12
13const headerSize = DEFAULT_SETTINGS_MAX_HEADER_LIST_SIZE;
14const timeout = common.platformTimeout(2_000);
15const timer = setTimeout(() => assert.fail(`http2 client timedout
16when server can not manage to send a header of size ${headerSize}`), timeout);
17
18const server = http2.createServer((req, res) => {
19  res.setHeader('foobar', 'a'.repeat(DEFAULT_SETTINGS_MAX_HEADER_LIST_SIZE));
20  res.end();
21});
22
23server.listen(0, common.mustCall(() => {
24  const clientSession = http2.connect(`http://localhost:${server.address().port}`);
25  clientSession.on('close', common.mustCall());
26  clientSession.on('remoteSettings', send);
27
28  function send() {
29    const stream = clientSession.request({ ':path': '/' });
30    stream.on('close', common.mustCall(() => {
31      assert.strictEqual(stream.rstCode, NGHTTP2_CANCEL);
32      clearTimeout(timer);
33      server.close();
34    }));
35
36    stream.end();
37  }
38}));
39