summaryrefslogtreecommitdiff
path: root/test/parallel/test-http.js
diff options
context:
space:
mode:
authorBrian White <mscdex@mscdex.net>2017-02-10 20:32:32 -0500
committerBrian White <mscdex@mscdex.net>2017-03-09 08:10:30 -0500
commitd3480776c70bb1622afee5a2a5f39abf9e42a507 (patch)
tree7fa5e0060ea77e8eca5705c7089847c309e4e3ef /test/parallel/test-http.js
parent6b2cef65c99cb40fb9ca0789670b9ea9f5fcc2dd (diff)
downloadandroid-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.js129
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);
});