diff options
author | Brian White <mscdex@mscdex.net> | 2017-02-10 20:32:32 -0500 |
---|---|---|
committer | Brian White <mscdex@mscdex.net> | 2017-03-09 08:10:30 -0500 |
commit | d3480776c70bb1622afee5a2a5f39abf9e42a507 (patch) | |
tree | 7fa5e0060ea77e8eca5705c7089847c309e4e3ef /test/parallel/test-http.js | |
parent | 6b2cef65c99cb40fb9ca0789670b9ea9f5fcc2dd (diff) | |
download | android-node-v8-d3480776c70bb1622afee5a2a5f39abf9e42a507.tar.gz android-node-v8-d3480776c70bb1622afee5a2a5f39abf9e42a507.tar.bz2 android-node-v8-d3480776c70bb1622afee5a2a5f39abf9e42a507.zip |
http: concatenate outgoing Cookie headers
This commit enables automatic concatenation of multiple Cookie header
values with a semicolon, except when 2D header arrays are used.
Fixes: https://github.com/nodejs/node/issues/11256
PR-URL: https://github.com/nodejs/node/pull/11259
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Roman Reiss <me@silverwind.io>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Diffstat (limited to 'test/parallel/test-http.js')
-rw-r--r-- | test/parallel/test-http.js | 129 |
1 files changed, 79 insertions, 50 deletions
diff --git a/test/parallel/test-http.js b/test/parallel/test-http.js index 1178c745e1..dc77be4fdd 100644 --- a/test/parallel/test-http.js +++ b/test/parallel/test-http.js @@ -1,84 +1,113 @@ 'use strict'; -require('../common'); +const common = require('../common'); const assert = require('assert'); const http = require('http'); const url = require('url'); -let responses_sent = 0; -let responses_recvd = 0; -let body0 = ''; -let body1 = ''; +const expectedRequests = ['/hello', '/there', '/world']; -const server = http.Server(function(req, res) { - if (responses_sent === 0) { - assert.strictEqual('GET', req.method); - assert.strictEqual('/hello', url.parse(req.url).pathname); +const server = http.Server(common.mustCall(function(req, res) { + assert.strictEqual(expectedRequests.shift(), req.url); - console.dir(req.headers); - assert.strictEqual(true, 'accept' in req.headers); - assert.strictEqual('*/*', req.headers['accept']); - - assert.strictEqual(true, 'foo' in req.headers); - assert.strictEqual('bar', req.headers['foo']); + switch (req.url) { + case '/hello': + assert.strictEqual(req.method, 'GET'); + assert.strictEqual(req.headers['accept'], '*/*'); + assert.strictEqual(req.headers['foo'], 'bar'); + assert.strictEqual(req.headers.cookie, 'foo=bar; bar=baz; baz=quux'); + break; + case '/there': + assert.strictEqual(req.method, 'PUT'); + assert.strictEqual(req.headers.cookie, 'node=awesome; ta=da'); + break; + case '/world': + assert.strictEqual(req.method, 'POST'); + assert.deepStrictEqual(req.headers.cookie, 'abc=123; def=456; ghi=789'); + break; + default: + assert(false, `Unexpected request for ${req.url}`); } - if (responses_sent === 1) { - assert.strictEqual('POST', req.method); - assert.strictEqual('/world', url.parse(req.url).pathname); + if (expectedRequests.length === 0) this.close(); - } req.on('end', function() { res.writeHead(200, {'Content-Type': 'text/plain'}); res.write('The path was ' + url.parse(req.url).pathname); res.end(); - responses_sent += 1; }); req.resume(); - - //assert.strictEqual('127.0.0.1', res.connection.remoteAddress); -}); +}, 3)); server.listen(0); server.on('listening', function() { const agent = new http.Agent({ port: this.address().port, maxSockets: 1 }); - http.get({ + const req = http.get({ port: this.address().port, path: '/hello', - headers: {'Accept': '*/*', 'Foo': 'bar'}, + headers: { + Accept: '*/*', + Foo: 'bar', + Cookie: [ 'foo=bar', 'bar=baz', 'baz=quux' ] + }, agent: agent - }, function(res) { - assert.strictEqual(200, res.statusCode); - responses_recvd += 1; + }, common.mustCall(function(res) { + const cookieHeaders = req._header.match(/^Cookie: .+$/img); + assert.deepStrictEqual(cookieHeaders, + ['Cookie: foo=bar; bar=baz; baz=quux']); + assert.strictEqual(res.statusCode, 200); + let body = ''; res.setEncoding('utf8'); - res.on('data', function(chunk) { body0 += chunk; }); - console.error('Got /hello response'); - }); + res.on('data', function(chunk) { body += chunk; }); + res.on('end', common.mustCall(function() { + assert.strictEqual(body, 'The path was /hello'); + })); + })); - setTimeout(function() { + setTimeout(common.mustCall(function() { + const req = http.request({ + port: server.address().port, + method: 'PUT', + path: '/there', + agent: agent + }, common.mustCall(function(res) { + const cookieHeaders = req._header.match(/^Cookie: .+$/img); + assert.deepStrictEqual(cookieHeaders, ['Cookie: node=awesome; ta=da']); + assert.strictEqual(res.statusCode, 200); + let body = ''; + res.setEncoding('utf8'); + res.on('data', function(chunk) { body += chunk; }); + res.on('end', common.mustCall(function() { + assert.strictEqual(body, 'The path was /there'); + })); + })); + req.setHeader('Cookie', ['node=awesome', 'ta=da']); + req.end(); + }), 1); + + setTimeout(common.mustCall(function() { const req = http.request({ port: server.address().port, method: 'POST', path: '/world', + headers: [ ['Cookie', 'abc=123'], + ['Cookie', 'def=456'], + ['Cookie', 'ghi=789'] ], agent: agent - }, function(res) { - assert.strictEqual(200, res.statusCode); - responses_recvd += 1; + }, common.mustCall(function(res) { + const cookieHeaders = req._header.match(/^Cookie: .+$/img); + assert.deepStrictEqual(cookieHeaders, + ['Cookie: abc=123', + 'Cookie: def=456', + 'Cookie: ghi=789']); + assert.strictEqual(res.statusCode, 200); + let body = ''; res.setEncoding('utf8'); - res.on('data', function(chunk) { body1 += chunk; }); - console.error('Got /world response'); - }); + res.on('data', function(chunk) { body += chunk; }); + res.on('end', common.mustCall(function() { + assert.strictEqual(body, 'The path was /world'); + })); + })); req.end(); - }, 1); -}); - -process.on('exit', function() { - console.error('responses_recvd: ' + responses_recvd); - assert.strictEqual(2, responses_recvd); - - console.error('responses_sent: ' + responses_sent); - assert.strictEqual(2, responses_sent); - - assert.strictEqual('The path was /hello', body0); - assert.strictEqual('The path was /world', body1); + }), 2); }); |