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