| '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]); |
| } |
| }); |