| // Copyright Joyent, Inc. and other Node contributors. |
| // |
| // Permission is hereby granted, free of charge, to any person obtaining a |
| // copy of this software and associated documentation files (the |
| // "Software"), to deal in the Software without restriction, including |
| // without limitation the rights to use, copy, modify, merge, publish, |
| // distribute, sublicense, and/or sell copies of the Software, and to permit |
| // persons to whom the Software is furnished to do so, subject to the |
| // following conditions: |
| // |
| // The above copyright notice and this permission notice shall be included |
| // in all copies or substantial portions of the Software. |
| // |
| // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
| // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN |
| // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
| // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
| // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE |
| // USE OR OTHER DEALINGS IN THE SOFTWARE. |
| |
| 'use strict'; |
| require('../common'); |
| const assert = require('assert'); |
| |
| const http = require('http'); |
| |
| http.createServer(function(req, res) { |
| const expectRawHeaders = [ |
| 'Host', |
| `localhost:${this.address().port}`, |
| 'transfer-ENCODING', |
| 'CHUNKED', |
| 'x-BaR', |
| 'yoyoyo', |
| 'Connection', |
| 'close' |
| ]; |
| const expectHeaders = { |
| 'host': `localhost:${this.address().port}`, |
| 'transfer-encoding': 'CHUNKED', |
| 'x-bar': 'yoyoyo', |
| 'connection': 'close' |
| }; |
| const expectRawTrailers = [ |
| 'x-bAr', |
| 'yOyOyOy', |
| 'x-baR', |
| 'OyOyOyO', |
| 'X-bAr', |
| 'yOyOyOy', |
| 'X-baR', |
| 'OyOyOyO' |
| ]; |
| const expectTrailers = { 'x-bar': 'yOyOyOy, OyOyOyO, yOyOyOy, OyOyOyO' }; |
| |
| this.close(); |
| |
| assert.deepStrictEqual(req.rawHeaders, expectRawHeaders); |
| assert.deepStrictEqual(req.headers, expectHeaders); |
| |
| req.on('end', function() { |
| assert.deepStrictEqual(req.rawTrailers, expectRawTrailers); |
| assert.deepStrictEqual(req.trailers, expectTrailers); |
| }); |
| |
| req.resume(); |
| res.setHeader('Trailer', 'x-foo'); |
| res.addTrailers([ |
| ['x-fOo', 'xOxOxOx'], |
| ['x-foO', 'OxOxOxO'], |
| ['X-fOo', 'xOxOxOx'], |
| ['X-foO', 'OxOxOxO'] |
| ]); |
| res.end('x f o o'); |
| }).listen(0, function() { |
| const req = http.request({ port: this.address().port, path: '/' }); |
| req.addTrailers([ |
| ['x-bAr', 'yOyOyOy'], |
| ['x-baR', 'OyOyOyO'], |
| ['X-bAr', 'yOyOyOy'], |
| ['X-baR', 'OyOyOyO'] |
| ]); |
| req.setHeader('transfer-ENCODING', 'CHUNKED'); |
| req.setHeader('x-BaR', 'yoyoyo'); |
| req.end('y b a r'); |
| req.on('response', function(res) { |
| const expectRawHeaders = [ |
| 'Trailer', |
| 'x-foo', |
| 'Date', |
| null, |
| 'Connection', |
| 'close', |
| 'Transfer-Encoding', |
| 'chunked' |
| ]; |
| const expectHeaders = { |
| 'trailer': 'x-foo', |
| 'date': null, |
| 'connection': 'close', |
| 'transfer-encoding': 'chunked' |
| }; |
| res.rawHeaders[3] = null; |
| res.headers.date = null; |
| assert.deepStrictEqual(res.rawHeaders, expectRawHeaders); |
| assert.deepStrictEqual(res.headers, expectHeaders); |
| res.on('end', function() { |
| const expectRawTrailers = [ |
| 'x-fOo', |
| 'xOxOxOx', |
| 'x-foO', |
| 'OxOxOxO', |
| 'X-fOo', |
| 'xOxOxOx', |
| 'X-foO', |
| 'OxOxOxO' |
| ]; |
| const expectTrailers = { 'x-foo': 'xOxOxOx, OxOxOxO, xOxOxOx, OxOxOxO' }; |
| |
| assert.deepStrictEqual(res.rawTrailers, expectRawTrailers); |
| assert.deepStrictEqual(res.trailers, expectTrailers); |
| console.log('ok'); |
| }); |
| res.resume(); |
| }); |
| }); |