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 { Readable } = require('stream'); 10 11function getSrc() { 12 const chunks = [ '', 'asdf', '', 'foo', '', 'bar', '' ]; 13 return new Readable({ 14 read() { 15 const chunk = chunks.shift(); 16 if (chunk !== undefined) 17 this.push(chunk); 18 else 19 this.push(null); 20 } 21 }); 22} 23 24const expect = 'asdffoobar'; 25 26const server = http2.createServer(); 27server.on('stream', common.mustCall((stream) => { 28 let actual = ''; 29 stream.respond(); 30 stream.resume(); 31 stream.setEncoding('utf8'); 32 stream.on('data', (chunk) => actual += chunk); 33 stream.on('end', common.mustCall(() => { 34 getSrc().pipe(stream); 35 assert.strictEqual(actual, expect); 36 })); 37})); 38 39server.listen(0, common.mustCall(() => { 40 const client = http2.connect(`http://localhost:${server.address().port}`); 41 let actual = ''; 42 const req = client.request({ ':method': 'POST' }); 43 req.on('response', common.mustCall()); 44 req.setEncoding('utf8'); 45 req.on('data', (chunk) => actual += chunk); 46 req.on('end', common.mustCall(() => { 47 assert.strictEqual(actual, expect); 48 server.close(); 49 client.close(); 50 })); 51 getSrc().pipe(req); 52})); 53