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( 34 common.mustCallAtLeast((list, observer) => { 35 const entries = list.getEntries(); 36 for (let n = 0; n < entries.length; n++) { 37 const entry = entries[n]; 38 if (entry.name !== 'Http2Session') continue; 39 if (entry.detail.type !== 'client') continue; 40 assert.strictEqual(entry.detail.framesReceived, targetFrameCount); 41 observer.disconnect(); 42 callback(); 43 } 44 })); 45 obs.observe({ type: 'http2' }); 46 const client = 47 http2.connect(`http://localhost:${server.address().port}`, () => { 48 const req = client.request({ ':path': path }); 49 req.resume(); 50 req.end(); 51 req.on('end', () => client.close()); 52 }); 53} 54 55// SETTINGS => SETTINGS => HEADERS => DATA 56const MIN_FRAME_COUNT = 4; 57 58server.listen(0, () => { 59 testRequest('/singleEnd', MIN_FRAME_COUNT, () => { 60 testRequest('/sequentialEnd', MIN_FRAME_COUNT, () => { 61 testRequest('/delayedEnd', MIN_FRAME_COUNT + 1, () => { 62 server.close(); 63 }); 64 }); 65 }); 66}); 67