1'use strict';
2
3const common = require('../common');
4if (!common.hasCrypto)
5  common.skip('missing crypto');
6const assert = require('assert');
7const h2 = require('http2');
8
9// Http2ServerRequest should have getter for trailers & rawTrailers
10
11const expectedTrailers = {
12  'x-foo': 'xOxOxOx, OxOxOxO, xOxOxOx, OxOxOxO',
13  'x-foo-test': 'test, test'
14};
15
16const server = h2.createServer();
17server.listen(0, common.mustCall(function() {
18  const port = server.address().port;
19  server.once('request', common.mustCall(function(request, response) {
20    let data = '';
21    request.setEncoding('utf8');
22    request.on('data', common.mustCallAtLeast((chunk) => data += chunk));
23    request.on('end', common.mustCall(() => {
24      const trailers = request.trailers;
25      for (const [name, value] of Object.entries(expectedTrailers)) {
26        assert.strictEqual(trailers[name], value);
27      }
28      assert.deepStrictEqual([
29        'x-foo',
30        'xOxOxOx',
31        'x-foo',
32        'OxOxOxO',
33        'x-foo',
34        'xOxOxOx',
35        'x-foo',
36        'OxOxOxO',
37        'x-foo-test',
38        'test, test',
39      ], request.rawTrailers);
40      assert.strictEqual(data, 'test\ntest');
41      response.end();
42    }));
43  }));
44
45  const url = `http://localhost:${port}`;
46  const client = h2.connect(url, common.mustCall(function() {
47    const headers = {
48      ':path': '/foobar',
49      ':method': 'POST',
50      ':scheme': 'http',
51      ':authority': `localhost:${port}`
52    };
53    const request = client.request(headers, { waitForTrailers: true });
54
55    request.on('wantTrailers', () => {
56      request.sendTrailers({
57        'x-fOo': 'xOxOxOx',
58        'x-foO': 'OxOxOxO',
59        'X-fOo': 'xOxOxOx',
60        'X-foO': 'OxOxOxO',
61        'x-foo-test': 'test, test'
62      });
63    });
64
65    request.resume();
66    request.on('end', common.mustCall(function() {
67      server.close();
68      client.close();
69    }));
70    request.write('test\n');
71    request.end('test');
72  }));
73}));
74