summaryrefslogtreecommitdiff
path: root/test/parallel/test-http-multiple-headers.js
blob: 8f52f817273c524594f0aea879d5df615adb4c69 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
'use strict';

// TODO@PI: Run all tests
const common = require('../common');
const assert = require('assert');
const { createServer, request } = require('http');

const server = createServer(
  { uniqueHeaders: ['x-res-b', 'x-res-d', 'x-res-y'] },
  common.mustCall((req, res) => {
    const host = `127.0.0.1:${server.address().port}`;

    assert.deepStrictEqual(req.rawHeaders, [
      'connection', 'close',
      'X-Req-a', 'eee',
      'X-Req-a', 'fff',
      'X-Req-a', 'ggg',
      'X-Req-a', 'hhh',
      'X-Req-b', 'iii; jjj; kkk; lll',
      'Host', host,
      'Transfer-Encoding', 'chunked',
    ]);
    assert.deepStrictEqual(req.headers, {
      'connection': 'close',
      'x-req-a': 'eee, fff, ggg, hhh',
      'x-req-b': 'iii; jjj; kkk; lll',
      host,
      'transfer-encoding': 'chunked'
    });
    assert.deepStrictEqual(req.headersDistinct, {
      'connection': ['close'],
      'x-req-a': ['eee', 'fff', 'ggg', 'hhh'],
      'x-req-b': ['iii; jjj; kkk; lll'],
      'host': [host],
      'transfer-encoding': ['chunked']
    });

    req.on('end', function() {
      assert.deepStrictEqual(req.rawTrailers, [
        'x-req-x', 'xxx',
        'x-req-x', 'yyy',
        'X-req-Y', 'zzz; www',
      ]);
      assert.deepStrictEqual(
        req.trailers, { 'x-req-x': 'xxx, yyy', 'x-req-y': 'zzz; www' }
      );
      assert.deepStrictEqual(
        req.trailersDistinct,
        { 'x-req-x': ['xxx', 'yyy'], 'x-req-y': ['zzz; www'] }
      );

      res.setHeader('X-Res-a', 'AAA');
      res.appendHeader('x-res-a', ['BBB', 'CCC']);
      res.setHeader('X-Res-b', ['DDD', 'EEE']);
      res.appendHeader('x-res-b', ['FFF', 'GGG']);
      res.removeHeader('date');
      res.writeHead(200, {
        'Connection': 'close', 'x-res-c': ['HHH', 'III'],
        'x-res-d': ['JJJ', 'KKK', 'LLL']
      });
      res.addTrailers({
        'x-res-x': ['XXX', 'YYY'],
        'X-Res-Y': ['ZZZ', 'WWW']
      });
      res.write('BODY');
      res.end();

      assert.deepStrictEqual(res.getHeader('X-Res-a'), ['AAA', 'BBB', 'CCC']);
      assert.deepStrictEqual(res.getHeader('x-res-a'), ['AAA', 'BBB', 'CCC']);
      assert.deepStrictEqual(
        res.getHeader('x-res-b'), ['DDD', 'EEE', 'FFF', 'GGG']
      );
      assert.deepStrictEqual(res.getHeader('x-res-c'), ['HHH', 'III']);
      assert.strictEqual(res.getHeader('connection'), 'close');
      assert.deepStrictEqual(
        res.getHeaderNames(),
        ['x-res-a', 'x-res-b', 'connection', 'x-res-c', 'x-res-d']
      );
      assert.deepStrictEqual(
        res.getRawHeaderNames(),
        ['X-Res-a', 'X-Res-b', 'Connection', 'x-res-c', 'x-res-d']
      );

      const headers = { __proto__: null };
      Object.assign(headers, {
        'x-res-a': [ 'AAA', 'BBB', 'CCC' ],
        'x-res-b': [ 'DDD', 'EEE', 'FFF', 'GGG' ],
        'connection': 'close',
        'x-res-c': [ 'HHH', 'III' ],
        'x-res-d': [ 'JJJ', 'KKK', 'LLL' ]
      });
      assert.deepStrictEqual(res.getHeaders(), headers);
    });

    req.resume();
  }
  ));

server.listen(0, common.mustCall(() => {
  const req = request({
    host: '127.0.0.1',
    port: server.address().port,
    path: '/',
    method: 'POST',
    headers: {
      'connection': 'close',
      'x-req-a': 'aaa',
      'X-Req-a': 'bbb',
      'X-Req-b': ['ccc', 'ddd']
    },
    uniqueHeaders: ['x-req-b', 'x-req-y']
  }, common.mustCall((res) => {
    assert.deepStrictEqual(res.rawHeaders, [
      'X-Res-a', 'AAA',
      'X-Res-a', 'BBB',
      'X-Res-a', 'CCC',
      'X-Res-b', 'DDD; EEE; FFF; GGG',
      'Connection', 'close',
      'x-res-c', 'HHH',
      'x-res-c', 'III',
      'x-res-d', 'JJJ; KKK; LLL',
      'Transfer-Encoding', 'chunked',
    ]);
    assert.deepStrictEqual(res.headers, {
      'x-res-a': 'AAA, BBB, CCC',
      'x-res-b': 'DDD; EEE; FFF; GGG',
      'connection': 'close',
      'x-res-c': 'HHH, III',
      'x-res-d': 'JJJ; KKK; LLL',
      'transfer-encoding': 'chunked'
    });
    assert.deepStrictEqual(res.headersDistinct, {
      'x-res-a': [ 'AAA', 'BBB', 'CCC' ],
      'x-res-b': [ 'DDD; EEE; FFF; GGG' ],
      'connection': [ 'close' ],
      'x-res-c': [ 'HHH', 'III' ],
      'x-res-d': [ 'JJJ; KKK; LLL' ],
      'transfer-encoding': [ 'chunked' ]
    });

    res.on('end', function() {
      assert.deepStrictEqual(res.rawTrailers, [
        'x-res-x', 'XXX',
        'x-res-x', 'YYY',
        'X-Res-Y', 'ZZZ; WWW',
      ]);
      assert.deepStrictEqual(
        res.trailers,
        { 'x-res-x': 'XXX, YYY', 'x-res-y': 'ZZZ; WWW' }
      );
      assert.deepStrictEqual(
        res.trailersDistinct,
        { 'x-res-x': ['XXX', 'YYY'], 'x-res-y': ['ZZZ; WWW'] }
      );
      server.close();
    });
    res.resume();
  }));

  req.setHeader('X-Req-a', ['eee', 'fff']);
  req.appendHeader('X-req-a', ['ggg', 'hhh']);
  req.setHeader('X-Req-b', ['iii', 'jjj']);
  req.appendHeader('x-req-b', ['kkk', 'lll']);

  req.addTrailers({
    'x-req-x': ['xxx', 'yyy'],
    'X-req-Y': ['zzz', 'www']
  });

  req.write('BODY');

  req.end();
}));