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