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