summaryrefslogtreecommitdiff
path: root/test/parallel/test-http-host-header-ipv6-fail.js
blob: 0c56afad7f28e54b72176f61a9f9b3695f8fd9a0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
'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]);
  }
});