• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict';
2
3const common = require('../common');
4if (!common.hasCrypto)
5  common.skip('missing crypto');
6const assert = require('assert');
7const http2 = require('http2');
8
9const { PerformanceObserver } = require('perf_hooks');
10
11const server = http2.createServer();
12
13server.on('stream', (stream, headers) => {
14  stream.respond({
15    'content-type': 'text/html',
16    ':status': 200
17  });
18  switch (headers[':path']) {
19    case '/singleEnd':
20      stream.end('OK');
21      break;
22    case '/sequentialEnd':
23      stream.write('OK');
24      stream.end();
25      break;
26    case '/delayedEnd':
27      stream.write('OK', () => stream.end());
28      break;
29  }
30});
31
32function testRequest(path, targetFrameCount, callback) {
33  const obs = new PerformanceObserver((list, observer) => {
34    const entry = list.getEntries()[0];
35    if (entry.name !== 'Http2Session') return;
36    if (entry.type !== 'client') return;
37    assert.strictEqual(entry.framesReceived, targetFrameCount);
38    observer.disconnect();
39    callback();
40  });
41  obs.observe({ entryTypes: ['http2'] });
42  const client = http2.connect(`http://localhost:${server.address().port}`, () => {
43    const req = client.request({ ':path': path });
44    req.resume();
45    req.end();
46    req.on('end', () => client.close());
47  });
48}
49
50// SETTINGS => SETTINGS => HEADERS => DATA
51const MIN_FRAME_COUNT = 4;
52
53server.listen(0, () => {
54  testRequest('/singleEnd', MIN_FRAME_COUNT, () => {
55    testRequest('/sequentialEnd', MIN_FRAME_COUNT, () => {
56      testRequest('/delayedEnd', MIN_FRAME_COUNT + 1, () => {
57        server.close();
58      });
59    });
60  });
61});
62