• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict';
2
3// TODO@PI: Run all tests
4const common = require('../common');
5const assert = require('assert');
6const { createServer, request } = require('http');
7
8const server = createServer(
9  { uniqueHeaders: ['x-res-b', 'x-res-d', 'x-res-y'] },
10  common.mustCall((req, res) => {
11    const host = `127.0.0.1:${server.address().port}`;
12
13    assert.deepStrictEqual(req.rawHeaders, [
14      'connection', 'close',
15      'X-Req-a', 'eee',
16      'X-Req-a', 'fff',
17      'X-Req-a', 'ggg',
18      'X-Req-a', 'hhh',
19      'X-Req-b', 'iii; jjj; kkk; lll',
20      'Host', host,
21      'Transfer-Encoding', 'chunked',
22    ]);
23    assert.deepStrictEqual(req.headers, {
24      'connection': 'close',
25      'x-req-a': 'eee, fff, ggg, hhh',
26      'x-req-b': 'iii; jjj; kkk; lll',
27      host,
28      'transfer-encoding': 'chunked'
29    });
30    assert.deepStrictEqual(req.headersDistinct, {
31      'connection': ['close'],
32      'x-req-a': ['eee', 'fff', 'ggg', 'hhh'],
33      'x-req-b': ['iii; jjj; kkk; lll'],
34      'host': [host],
35      'transfer-encoding': ['chunked']
36    });
37
38    req.on('end', function() {
39      assert.deepStrictEqual(req.rawTrailers, [
40        'x-req-x', 'xxx',
41        'x-req-x', 'yyy',
42        'X-req-Y', 'zzz; www',
43      ]);
44      assert.deepStrictEqual(
45        req.trailers, { 'x-req-x': 'xxx, yyy', 'x-req-y': 'zzz; www' }
46      );
47      assert.deepStrictEqual(
48        req.trailersDistinct,
49        { 'x-req-x': ['xxx', 'yyy'], 'x-req-y': ['zzz; www'] }
50      );
51
52      res.setHeader('X-Res-a', 'AAA');
53      res.appendHeader('x-res-a', ['BBB', 'CCC']);
54      res.setHeader('X-Res-b', ['DDD', 'EEE']);
55      res.appendHeader('x-res-b', ['FFF', 'GGG']);
56      res.removeHeader('date');
57      res.writeHead(200, {
58        'Connection': 'close', 'x-res-c': ['HHH', 'III'],
59        'x-res-d': ['JJJ', 'KKK', 'LLL']
60      });
61      res.addTrailers({
62        'x-res-x': ['XXX', 'YYY'],
63        'X-Res-Y': ['ZZZ', 'WWW']
64      });
65      res.write('BODY');
66      res.end();
67
68      assert.deepStrictEqual(res.getHeader('X-Res-a'), ['AAA', 'BBB', 'CCC']);
69      assert.deepStrictEqual(res.getHeader('x-res-a'), ['AAA', 'BBB', 'CCC']);
70      assert.deepStrictEqual(
71        res.getHeader('x-res-b'), ['DDD', 'EEE', 'FFF', 'GGG']
72      );
73      assert.deepStrictEqual(res.getHeader('x-res-c'), ['HHH', 'III']);
74      assert.strictEqual(res.getHeader('connection'), 'close');
75      assert.deepStrictEqual(
76        res.getHeaderNames(),
77        ['x-res-a', 'x-res-b', 'connection', 'x-res-c', 'x-res-d']
78      );
79      assert.deepStrictEqual(
80        res.getRawHeaderNames(),
81        ['X-Res-a', 'X-Res-b', 'Connection', 'x-res-c', 'x-res-d']
82      );
83
84      const headers = Object.create(null);
85      Object.assign(headers, {
86        'x-res-a': [ 'AAA', 'BBB', 'CCC' ],
87        'x-res-b': [ 'DDD', 'EEE', 'FFF', 'GGG' ],
88        'connection': 'close',
89        'x-res-c': [ 'HHH', 'III' ],
90        'x-res-d': [ 'JJJ', 'KKK', 'LLL' ]
91      });
92      assert.deepStrictEqual(res.getHeaders(), headers);
93    });
94
95    req.resume();
96  }
97  ));
98
99server.listen(0, common.mustCall(() => {
100  const req = request({
101    host: '127.0.0.1',
102    port: server.address().port,
103    path: '/',
104    method: 'POST',
105    headers: {
106      'connection': 'close',
107      'x-req-a': 'aaa',
108      'X-Req-a': 'bbb',
109      'X-Req-b': ['ccc', 'ddd']
110    },
111    uniqueHeaders: ['x-req-b', 'x-req-y']
112  }, common.mustCall((res) => {
113    assert.deepStrictEqual(res.rawHeaders, [
114      'X-Res-a', 'AAA',
115      'X-Res-a', 'BBB',
116      'X-Res-a', 'CCC',
117      'X-Res-b', 'DDD; EEE; FFF; GGG',
118      'Connection', 'close',
119      'x-res-c', 'HHH',
120      'x-res-c', 'III',
121      'x-res-d', 'JJJ; KKK; LLL',
122      'Transfer-Encoding', 'chunked',
123    ]);
124    assert.deepStrictEqual(res.headers, {
125      'x-res-a': 'AAA, BBB, CCC',
126      'x-res-b': 'DDD; EEE; FFF; GGG',
127      'connection': 'close',
128      'x-res-c': 'HHH, III',
129      'x-res-d': 'JJJ; KKK; LLL',
130      'transfer-encoding': 'chunked'
131    });
132    assert.deepStrictEqual(res.headersDistinct, {
133      'x-res-a': [ 'AAA', 'BBB', 'CCC' ],
134      'x-res-b': [ 'DDD; EEE; FFF; GGG' ],
135      'connection': [ 'close' ],
136      'x-res-c': [ 'HHH', 'III' ],
137      'x-res-d': [ 'JJJ; KKK; LLL' ],
138      'transfer-encoding': [ 'chunked' ]
139    });
140
141    res.on('end', function() {
142      assert.deepStrictEqual(res.rawTrailers, [
143        'x-res-x', 'XXX',
144        'x-res-x', 'YYY',
145        'X-Res-Y', 'ZZZ; WWW',
146      ]);
147      assert.deepStrictEqual(
148        res.trailers,
149        { 'x-res-x': 'XXX, YYY', 'x-res-y': 'ZZZ; WWW' }
150      );
151      assert.deepStrictEqual(
152        res.trailersDistinct,
153        { 'x-res-x': ['XXX', 'YYY'], 'x-res-y': ['ZZZ; WWW'] }
154      );
155      server.close();
156    });
157    res.resume();
158  }));
159
160  req.setHeader('X-Req-a', ['eee', 'fff']);
161  req.appendHeader('X-req-a', ['ggg', 'hhh']);
162  req.setHeader('X-Req-b', ['iii', 'jjj']);
163  req.appendHeader('x-req-b', ['kkk', 'lll']);
164
165  req.addTrailers({
166    'x-req-x': ['xxx', 'yyy'],
167    'X-req-Y': ['zzz', 'www']
168  });
169
170  req.write('BODY');
171
172  req.end();
173}));
174