|
|
|
'use strict';
|
|
|
|
/*
|
|
|
|
* When using the object form of http.request and using an IPv6 address
|
|
|
|
* as a hostname, and using a non-standard port, the Host header
|
|
|
|
* is improperly formatted.
|
|
|
|
* Issue: https://github.com/nodejs/node/issues/5308
|
|
|
|
* As per https://tools.ietf.org/html/rfc7230#section-5.4 and
|
|
|
|
* https://tools.ietf.org/html/rfc3986#section-3.2.2
|
|
|
|
* the IPv6 address should be enclosed in square brackets
|
|
|
|
*/
|
|
|
|
|
|
|
|
const common = require('../common');
|
|
|
|
const assert = require('assert');
|
|
|
|
const http = require('http');
|
|
|
|
const net = require('net');
|
|
|
|
|
|
|
|
const requests = [
|
|
|
|
{ host: 'foo:1234', headers: { expectedhost: 'foo:1234:80' } },
|
|
|
|
{ host: '::1', headers: { expectedhost: '[::1]:80' } }
|
|
|
|
];
|
|
|
|
|
|
|
|
function createLocalConnection(options) {
|
|
|
|
options.host = undefined;
|
|
|
|
options.port = this.port;
|
|
|
|
options.path = undefined;
|
|
|
|
return net.createConnection(options);
|
|
|
|
}
|
|
|
|
|
|
|
|
http.createServer(common.mustCall(function(req, res) {
|
|
|
|
this.requests = this.requests || 0;
|
|
|
|
assert.strictEqual(req.headers.host, req.headers.expectedhost);
|
|
|
|
res.end();
|
|
|
|
if (++this.requests === requests.length)
|
|
|
|
this.close();
|
|
|
|
}, requests.length)).listen(0, function() {
|
|
|
|
const address = this.address();
|
|
|
|
for (let i = 0; i < requests.length; ++i) {
|
|
|
|
requests[i].createConnection =
|
|
|
|
common.mustCall(createLocalConnection.bind(address));
|
|
|
|
http.get(requests[i]);
|
|
|
|
}
|
|
|
|
});
|