• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Flags: --no-warnings
2'use strict';
3
4const common = require('../common');
5if (!common.hasCrypto)
6  common.skip('missing crypto');
7const assert = require('assert');
8const h2 = require('http2');
9
10const { PerformanceObserver } = require('perf_hooks');
11
12const obs = new PerformanceObserver(common.mustCallAtLeast((items) => {
13  const entry = items.getEntries()[0];
14  assert.strictEqual(entry.entryType, 'http2');
15  assert.strictEqual(typeof entry.startTime, 'number');
16  assert.strictEqual(typeof entry.duration, 'number');
17  switch (entry.name) {
18    case 'Http2Session':
19      assert.strictEqual(typeof entry.pingRTT, 'number');
20      assert.strictEqual(typeof entry.streamAverageDuration, 'number');
21      assert.strictEqual(typeof entry.streamCount, 'number');
22      assert.strictEqual(typeof entry.framesReceived, 'number');
23      assert.strictEqual(typeof entry.framesSent, 'number');
24      assert.strictEqual(typeof entry.bytesWritten, 'number');
25      assert.strictEqual(typeof entry.bytesRead, 'number');
26      assert.strictEqual(typeof entry.maxConcurrentStreams, 'number');
27      assert.strictEqual(typeof entry.detail.pingRTT, 'number');
28      assert.strictEqual(typeof entry.detail.streamAverageDuration, 'number');
29      assert.strictEqual(typeof entry.detail.streamCount, 'number');
30      assert.strictEqual(typeof entry.detail.framesReceived, 'number');
31      assert.strictEqual(typeof entry.detail.framesSent, 'number');
32      assert.strictEqual(typeof entry.detail.bytesWritten, 'number');
33      assert.strictEqual(typeof entry.detail.bytesRead, 'number');
34      assert.strictEqual(typeof entry.detail.maxConcurrentStreams, 'number');
35      switch (entry.type) {
36        case 'server':
37          assert.strictEqual(entry.detail.streamCount, 1);
38          assert(entry.detail.framesReceived >= 3);
39          break;
40        case 'client':
41          assert.strictEqual(entry.detail.streamCount, 1);
42          assert.strictEqual(entry.detail.framesReceived, 7);
43          break;
44        default:
45          assert.fail('invalid Http2Session type');
46      }
47      break;
48    case 'Http2Stream':
49      assert.strictEqual(typeof entry.timeToFirstByte, 'number');
50      assert.strictEqual(typeof entry.timeToFirstByteSent, 'number');
51      assert.strictEqual(typeof entry.timeToFirstHeader, 'number');
52      assert.strictEqual(typeof entry.bytesWritten, 'number');
53      assert.strictEqual(typeof entry.bytesRead, 'number');
54      assert.strictEqual(typeof entry.detail.timeToFirstByte, 'number');
55      assert.strictEqual(typeof entry.detail.timeToFirstByteSent, 'number');
56      assert.strictEqual(typeof entry.detail.timeToFirstHeader, 'number');
57      assert.strictEqual(typeof entry.detail.bytesWritten, 'number');
58      assert.strictEqual(typeof entry.detail.bytesRead, 'number');
59      break;
60    default:
61      assert.fail('invalid entry name');
62  }
63}));
64
65obs.observe({ type: 'http2' });
66
67const body =
68  '<html><head></head><body><h1>this is some data</h2></body></html>';
69
70const server = h2.createServer();
71
72// We use the lower-level API here
73server.on('stream', common.mustCall(onStream));
74
75function onStream(stream, headers, flags) {
76  assert.strictEqual(headers[':scheme'], 'http');
77  assert.ok(headers[':authority']);
78  assert.strictEqual(headers[':method'], 'GET');
79  assert.strictEqual(flags, 5);
80  stream.respond({
81    'content-type': 'text/html',
82    ':status': 200
83  });
84  stream.write(body.slice(0, 20));
85  stream.end(body.slice(20));
86}
87
88server.on('session', common.mustCall((session) => {
89  session.ping(common.mustCall());
90}));
91
92server.listen(0);
93
94server.on('listening', common.mustCall(() => {
95
96  const client = h2.connect(`http://localhost:${server.address().port}`);
97
98  client.on('connect', common.mustCall(() => {
99    client.ping(common.mustCall());
100  }));
101
102  const req = client.request();
103
104  req.on('response', common.mustCall());
105
106  let data = '';
107  req.setEncoding('utf8');
108  req.on('data', (d) => data += d);
109  req.on('end', common.mustCall(() => {
110    assert.strictEqual(body, data);
111  }));
112  req.on('close', common.mustCall(() => {
113    client.close();
114    server.close();
115  }));
116
117}));
118