Skip to content

Commit 4d3a3b1

Browse files
mattiashfengmk2
authored andcommitted
fix: Handle ipv6 addresses in host-header correctly with TLS (#53)
When a url uses an ipv6-addresses as the host part, the host-header of the request will be [::1]:3000 (for ipv6 address ::1). To verify the IP address against a TLS certificate, we need to extract the IP-address correctly. Requires node with nodejs/node#14736 resolved to work. * Add ca certificate and check that certs are valid * Add tests for certificates with ipv6 addresses * Fix check for supported node version * Skip test if ipv6 is not available
1 parent 55a7a5c commit 4d3a3b1

File tree

10 files changed

+279
-45
lines changed

10 files changed

+279
-45
lines changed

lib/_http_agent.js

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -196,13 +196,8 @@ Agent.prototype.addRequest = function addRequest(req, options, port/*legacy*/,
196196
options = util._extend({}, options);
197197
options = util._extend(options, this.options);
198198

199-
if (!options.servername) {
200-
options.servername = options.host;
201-
const hostHeader = req.getHeader('host');
202-
if (hostHeader) {
203-
options.servername = hostHeader.replace(/:.*$/, '');
204-
}
205-
}
199+
if (!options.servername)
200+
options.servername = calculateServerName(options, req);
206201

207202
var name = this.getName(options);
208203
if (!this.sockets[name]) {
@@ -258,13 +253,8 @@ Agent.prototype.createSocket = function createSocket(req, options, cb) {
258253
options = util._extend({}, options);
259254
options = util._extend(options, self.options);
260255

261-
if (!options.servername) {
262-
options.servername = options.host;
263-
const hostHeader = req.getHeader('host');
264-
if (hostHeader) {
265-
options.servername = hostHeader.replace(/:.*$/, '');
266-
}
267-
}
256+
if (!options.servername)
257+
options.servername = calculateServerName(options, req);
268258

269259
var name = self.getName(options);
270260
options._agentKey = name;
@@ -342,6 +332,29 @@ Agent.prototype.createSocket = function createSocket(req, options, cb) {
342332
}
343333
};
344334

335+
function calculateServerName(options, req) {
336+
let servername = options.host;
337+
const hostHeader = req.getHeader('host');
338+
if (hostHeader) {
339+
// abc => abc
340+
// abc:123 => abc
341+
// [::1] => ::1
342+
// [::1]:123 => ::1
343+
if (hostHeader.startsWith('[')) {
344+
const index = hostHeader.indexOf(']');
345+
if (index === -1) {
346+
// Leading '[', but no ']'. Need to do something...
347+
servername = hostHeader;
348+
} else {
349+
servername = hostHeader.substr(1, index - 1);
350+
}
351+
} else {
352+
servername = hostHeader.split(':', 1)[0];
353+
}
354+
}
355+
return servername;
356+
}
357+
345358
Agent.prototype.removeSocket = function removeSocket(s, options) {
346359
var name = this.getName(options);
347360
debug('removeSocket', name, 'writable:', s.writable);

test/fixtures/agenttest-cert.pem

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
-----BEGIN CERTIFICATE-----
2-
MIICaTCCAdICCQDsGV9pOh7bwjANBgkqhkiG9w0BAQUFADB5MQswCQYDVQQGEwJB
3-
VTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0
4-
cyBQdHkgTHRkMRAwDgYDVQQDEwdmZW5nbWsyMSAwHgYJKoZIhvcNAQkBFhFmZW5n
5-
bWsyQGdtYWlsLmNvbTAeFw0xMzAzMjIwNzQ2MjBaFw0xMzA0MjEwNzQ2MjBaMHkx
6-
CzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRl
7-
cm5ldCBXaWRnaXRzIFB0eSBMdGQxEDAOBgNVBAMTB2ZlbmdtazIxIDAeBgkqhkiG
8-
9w0BCQEWEWZlbmdtazJAZ21haWwuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
9-
iQKBgQCjZLaMW373Af9BkrGQ1il8Focy/DZUz4YXXMAiBWFE8dudrdVPQaDPoYv2
10-
p7ZJr8K0UxGf4svdhsqWkoQ+LcYaHn1Ffez5SR/6Vbic4k8w30RR+a5Iyf2K9ag9
11-
0jCqbBlU8roSQ2fx52oMlbhTQsodcLikoCs9DqYSptmlAmnOCwIDAQABMA0GCSqG
12-
SIb3DQEBBQUAA4GBAJodC7/MlaUYlrG+7PqI3B7226sk2TrdllJOkDVz+bCjQ9HD
13-
/ngeHMKbAh5t4+A5zXtTpPM0XTE6vMmkMsXGNUj1P8BHWPBfGM9+80NphhHX8CzE
14-
qXUvbxHo0TM3qx434OjkDH1ksIBBGUoJDr7YVzhw4guYFvHBnGOzDHdh7QiM
2+
MIIC+jCCAeKgAwIBAgIJAMuPffHFVqVzMA0GCSqGSIb3DQEBCwUAMGExCzAJBgNV
3+
BAYTAlNFMRIwEAYDVQQIDAlTdG9ja2hvbG0xEjAQBgNVBAcMCVN0b2NraG9sbTEL
4+
MAkGA1UEAwwCY2ExHTAbBgkqhkiG9w0BCQEWDmNhQGV4YW1wbGUuY29tMB4XDTE3
5+
MTAyMDExMzQwOFoXDTIwMDcxNTExMzQwOFowUjELMAkGA1UEBhMCU0UxEjAQBgNV
6+
BAgMCVN0b2NraG9sbTESMBAGA1UEBwwJU3RvY2tob2xtMRswGQYDVQQDDBJhZ2Vu
7+
dGtlZXBhbGl2ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOWRbiod
8+
/IXLR3z3bDfN4DMqzXn8A5+V7Qz3Z/FpgMoQxV/fUgvJIh4l6CwCN+aBa9pBvRUf
9+
U77CnGuSn1uQAKIRWvlJ5KqrzHqCyU03bFRcAPDwFDFrD5+49Ici5M5tTSuIsj7P
10+
jZuVIOL4oXZ4Biq8P8KGFl9g9Bs8Ttj4trmPAgMBAAGjSDBGMCwGA1UdEQQlMCOH
11+
BH8AAAGHEAAAAAAAAAAAAAAAAAAAAAGCCWxvY2FsaG9zdDAJBgNVHRMEAjAAMAsG
12+
A1UdDwQEAwIF4DANBgkqhkiG9w0BAQsFAAOCAQEAsD/3f+HO1FJo9kOSitaJV4z7
13+
+5NLX3CRpn9vYJU1D6KFLyHJ2Nzuv8lJm0lnMhkO85xfDNCOotokK236vFTFQZpT
14+
VQMZraHzU7aJ0xHC01vXMMXrtY1IoBWZQoyONoU4texmoHcYte408innxHcfTzuf
15+
xFE6id1R9KdrHe/tIt2b0E+7aBCh3RUSP9uEx1/HgNkAEGULo9JAh3JaRJT5ft3M
16+
xCqMGf9RsqUhENOJ/UonEHoaR8gT5QqOrbwq9HezRDSK2LyppCEZ9NE7Yezm3HIP
17+
BhtYMKeNMlwZigyJ0k/ygWXRADSzwcSbrhuB/QZoDdxqhinJCTS4OestY1nQoA==
1518
-----END CERTIFICATE-----

test/fixtures/agenttest-key.pem

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
-----BEGIN RSA PRIVATE KEY-----
2-
MIICXAIBAAKBgQCjZLaMW373Af9BkrGQ1il8Focy/DZUz4YXXMAiBWFE8dudrdVP
3-
QaDPoYv2p7ZJr8K0UxGf4svdhsqWkoQ+LcYaHn1Ffez5SR/6Vbic4k8w30RR+a5I
4-
yf2K9ag90jCqbBlU8roSQ2fx52oMlbhTQsodcLikoCs9DqYSptmlAmnOCwIDAQAB
5-
AoGAKBW3KyvvNA4LXzzrzwqbVtP4CywQ8DGRRf39LNuBB3cGV+KjqDQDjaymN7bh
6-
Y6Z47+BJPJ5ZQVmmLdZ4FwEHzlA1PhoeIhJ5jXB1orqiadkEn+4lRXR3twexpvzo
7-
GU/2VgN80hVwQQhEKH5ZFXFpIwle+c9TD34L1s8XhqHrEtECQQDSMHfVEsmjyjBY
8-
Ff5b0Q42bN5EsgiMTmV0T1/13aGnAvvILrW1WQ74h43Mb3hQV6KXEvUzui/HWHg+
9-
+fPJHAqfAkEAxwFDPZhsdatjnBPfQu6KKf8VZwKgUhwglCgR0ofceQwwsb5yhg9K
10-
/lej2HMNil6Jtq50oiZc55akMvltXxuxFQJBAKCfTVPU0aaLAjquQ/yiW3wX4hsY
11-
+hNObZVeevSGc9wPGZ22pEF7V0dxP1k07fpnneZZJGxtIcnyv6FQnY3YEf0CQBJd
12-
a3cjud6iEm805kWm/dkiUTdQZrstHVSO3hYvs4j4NwYwLSFyB9mw/M3c0EMUtmDF
13-
eL3+DFTS8hRCMHW2eIECQEuKwy8HOJIoM/BbIlkXupeMypD0Y/aIQ+YLinunHK7v
14-
Cq5mFf6oALSTpDQm2yjmBS3d7+geZ4YTH/iUq1q8nvQ=
2+
MIICXgIBAAKBgQDlkW4qHfyFy0d892w3zeAzKs15/AOfle0M92fxaYDKEMVf31IL
3+
ySIeJegsAjfmgWvaQb0VH1O+wpxrkp9bkACiEVr5SeSqq8x6gslNN2xUXADw8BQx
4+
aw+fuPSHIuTObU0riLI+z42blSDi+KF2eAYqvD/ChhZfYPQbPE7Y+La5jwIDAQAB
5+
AoGAf4Icb1ZCeUnkRhvjRseZ/LGMeXGpzYznoqkUWblg6FsSVeLjXlp0Ecy6PR9q
6+
TySZdBvJWx8QU8ciPHmu+5trTYwHyTcoj4vZ7yIi5bgJLzIcbKv7zeeiKF+u9+iX
7+
VkLHVdGXWkpw+AsgKZWHfAp9hKcUnSMGW72bU7buUXe0dLkCQQD0xoJKkc4WeLxb
8+
cEqrmks9cIAVxn9QQpqsP5E174Pe6Nq+YPpCiz3vURPb/uTM487NhOX4qwIbmn/F
9+
8lW+4e6rAkEA8Bhl33lMPy3mSD8t+Vl8Nzd96OSl4O9MI1X//hwAK3Unpir0POzb
10+
LprTftVK2w015vFZlWe3Smf3R8pFMllQrQJBAKeX4027Vyf7srvIvteP5URD6u79
11+
4d3KPK0DOSF8xQWy2VLQg4lcXSOml7phY7cFo2sEO5FvRRoxRpr5ucvgVdECQQDf
12+
6tEvvw+WKLeJD6tPzt4jHRTHXF87zdFjbzRlCDY8UXHd7leEbp3n9CtlMYUzkDmC
13+
HfsfdPAja5zajlFEqLmtAkEAsxUKoiBkrJ1TQUmepETKtPNk6eNU8O3Gf484E2Aa
14+
ooNrBva7VvyuOw+OgQKnXZ4sH37uNkS1KQHDp/x5kZX+DQ==
1515
-----END RSA PRIVATE KEY-----

test/fixtures/ca.cnf

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
[ ca ]
2+
default_ca = CA_default
3+
4+
[ CA_default ]
5+
serial = ca-serial
6+
crl = ca-crl.pem
7+
database = ca-database.txt
8+
name_opt = CA_default
9+
cert_opt = CA_default
10+
default_crl_days = 9999
11+
default_md = md5
12+
13+
[ req ]
14+
default_bits = 2048
15+
days = 9999
16+
distinguished_name = req_distinguished_name
17+
attributes = req_attributes
18+
prompt = no
19+
20+
[ req_distinguished_name ]
21+
C = SE
22+
ST = Stockholm
23+
L = Stockholm
24+
CN = ca
25+
emailAddress = [email protected]
26+
27+
[ req_attributes ]
28+
challengePassword = test

test/fixtures/ca.key

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDirhR/SK8uxDp3
3+
pZANtV3IeTKFwLdA2G6xNgo7isgCG+OnzEN8zKePSL6vSoUJnYH5KYmNOlO2zc0b
4+
qrvUQWd375WB/zl3MEjJS1+taLxyO+lFlq7fPoB/V4XO+s0l2cA4PyGAkCcisJ5s
5+
LCI2oaxrbjkOPzHC4W05Cj8Svn440kf/2faeHYIdhHGVs36t6nb5d2WnivPvmucp
6+
FOShhK+LFBxL7AQIdoeDdpkjdukT9CnnRT5S1LUq6ReXzjhYqhGU+nmn6GqznpPn
7+
cnZFIRdBQvM3b5BL2NLb5VzglUa2fNYqYGKNGgzj9G/depW8QHOxk3VUJS7vaY0z
8+
PlkTgPO3AgMBAAECggEBAMk4Pnm+y8N37W7ISVfh555N98tDh2jIt3oXvn2cdG9q
9+
0mvhpwbhpNxMdvij7fTbHMVRWglD/YwIpEorBREl/fM5ej4rkZd8BSCrCAOnNaEy
10+
DaD4YcNKeEaSKvXRLMqswTUs1VCKpjLlFbxwcO6OFcBH194Nut6DvbEkp1i8QM+u
11+
LwF4Sqm6r/CbJMMG6RSamb+nwSu2s8HH+B/n+ba8rNQNqJIwxueGuZGSzQ82SoYp
12+
Mtq8v/Lb0Ea+OeN6cG1zhHe5vwT8o/vfPzkH50tI6kq4lltai3MaqxcaV3XRc8R0
13+
lndGL4Rf/Q+AiF2nYgZZYpVdkbW06e7GSFfE7OmLPgECgYEA9HKuOHklNwzsOyDo
14+
KMQ6iSGCPwUQSBgyNOF/uu+wwPnOxGU3GaSsC8QFNsgKlDfXjTFefJwdzhvGB5ES
15+
JQxIYwa1TwCODavrNow7LUIExC8P6NI7DyWOeZZenVIHhBEejrbzMaiAS0/hklL8
16+
EZpeNniQHED/S37kWZdEp3SE+1MCgYEA7WRxiHxARu54A1lIv2b+3NSSS7lTqweW
17+
ELswyl6CGm2HQlt4iWccSqM5xMb9idJPDehijj92rXR1k64SurEL2OQstKg3ivfq
18+
TcKKyVmj1WDm2v56LXIpjAb7Iy6ewbRmC9WWs4Wfqf6KK7Nm3FzDpKf5Uarqm3eh
19+
Z0vvQMPpfY0CgYEAogkKt2CGbLFiPeeYPL2mV5QgtAl1O3TegvMfKhkMPz7X8pNt
20+
LNBdQwdStXdwm8NQXMVm7o7FqwP6BrYBIxG7QfkGYjHp9+IH7oaSC3QBmNHhZ+FD
21+
SM0KXkpwuTPQy5hVeyCGoFojgMiYq9faQwjifpT4YeIr2C1qzIBa/+1a4QUCgYEA
22+
5+PgC2TkHOXBEfRbXaysdOao6ZNlKYJFkp5oMKZVDJ/FKorTmdTBDB+ZxKBk9gYb
23+
9wfzjeRsd091swatgPSFEB8DlI1lhDhcBg1tKPaJVVxM5csDafVEpGYFV/6oUat4
24+
q0K+7SowJwxfyAR9C/EJo4P5xU7h0W/wmEjSsz8si9kCgYBDA5wGbBcr55zkEO5L
25+
7bnTq8jCtUmFcZaosWlRmsSB7gHQva+bmnmtJbSpzKbGgGHp6c21BowRXO0E7lZv
26+
aIZz2SzIR9+JQw9GtVy2e797oZzhG2+u/BIkxGwowlPRVsiM468fID/j7VMRWXsM
27+
FZBgmTZ8TpJPtO+1VTB1j5QdPg==
28+
-----END PRIVATE KEY-----

test/fixtures/ca.pem

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDPjCCAiYCCQDsuRUq6wfGEDANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJT
3+
RTESMBAGA1UECAwJU3RvY2tob2xtMRIwEAYDVQQHDAlTdG9ja2hvbG0xCzAJBgNV
4+
BAMMAmNhMR0wGwYJKoZIhvcNAQkBFg5jYUBleGFtcGxlLmNvbTAeFw0xNzEwMjAx
5+
MTM0MDhaFw00NTAzMDYxMTM0MDhaMGExCzAJBgNVBAYTAlNFMRIwEAYDVQQIDAlT
6+
dG9ja2hvbG0xEjAQBgNVBAcMCVN0b2NraG9sbTELMAkGA1UEAwwCY2ExHTAbBgkq
7+
hkiG9w0BCQEWDmNhQGV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
8+
MIIBCgKCAQEA4q4Uf0ivLsQ6d6WQDbVdyHkyhcC3QNhusTYKO4rIAhvjp8xDfMyn
9+
j0i+r0qFCZ2B+SmJjTpTts3NG6q71EFnd++Vgf85dzBIyUtfrWi8cjvpRZau3z6A
10+
f1eFzvrNJdnAOD8hgJAnIrCebCwiNqGsa245Dj8xwuFtOQo/Er5+ONJH/9n2nh2C
11+
HYRxlbN+rep2+Xdlp4rz75rnKRTkoYSvixQcS+wECHaHg3aZI3bpE/Qp50U+UtS1
12+
KukXl844WKoRlPp5p+hqs56T53J2RSEXQULzN2+QS9jS2+Vc4JVGtnzWKmBijRoM
13+
4/Rv3XqVvEBzsZN1VCUu72mNMz5ZE4DztwIDAQABMA0GCSqGSIb3DQEBCwUAA4IB
14+
AQAgR8F1/E3slNqbHEk5pLqPw4V0Trk3jB8yNwpkhdpYJKSeAxuX4FdS+vCd1wG6
15+
V3GG7VR/iQABlH/YQjhqAMGjMhmGbZgvEENr9hRYf6Rp7eEC4gddwn4zq/xv90n6
16+
/St4V5Ek4/jnTXdwaZFWR1UHiwhYJ4qUYsKR1TiA3nGckKtd52+Veu+xu9DCEOlI
17+
R2PAKca7bwH+M9GosIV6SJdh+YT3+7hp0d2xUjPvDDXVcb2ezGyxsfDJmXsa0YEt
18+
V5NvocKipnU2ZYHUvORLix/7OyaHkrsfdwvaFlvRNBKge3F/l+bcs50WhD5daB+g
19+
bdLER/TWIIcc6x4karOucHS8
20+
-----END CERTIFICATE-----

test/fixtures/genkey.sh

100644100755
Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,22 @@
1+
#!/bin/bash
2+
# DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
3+
4+
# Generate ca key and pem
5+
openssl req -new -x509 -nodes -days 9999 -config ca.cnf -keyout ca.key -out ca.pem
6+
7+
# Generate server key
8+
# openssl genrsa -out server.key 2048
19
openssl genrsa -out agenttest-key.pem 1024
2-
openssl req -new -key agenttest-key.pem -out certrequest.csr
3-
openssl x509 -req -in certrequest.csr -signkey agenttest-key.pem -out agenttest-cert.pem
4-
rm certrequest.csr
10+
11+
# Generate a certificate signing request for server.key
12+
# openssl req -new -key server.key -out server.csr
13+
openssl req -new -key agenttest-key.pem -out agenttest.csr -config server.cnf
14+
15+
# Sign the csr with the ca certificate, generating server.pem
16+
openssl x509 -req -extfile server.cnf -days 999 -passin "pass:password" -extensions v3_req -in agenttest.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out agenttest-cert.pem
17+
18+
# openssl req -new -key agenttest-key.pem -out certrequest.csr
19+
rm agenttest.csr ca.srl
520
# http://www.hacksparrow.com/node-js-https-ssl-certificate.html
21+
22+

test/fixtures/server.cnf

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
[ req ]
2+
default_bits = 2048
3+
days = 9999
4+
distinguished_name = req_distinguished_name
5+
attributes = req_attributes
6+
prompt = no
7+
x509_extensions = v3_ca
8+
req_extensions = v3_req
9+
10+
[ req_distinguished_name ]
11+
C = SE
12+
ST = Stockholm
13+
L = Stockholm
14+
CN = agentkeepalive.com
15+
16+
[ req_attributes ]
17+
challengePassword = password
18+
19+
[ v3_ca ]
20+
authorityInfoAccess = @issuer_info
21+
22+
[ v3_req ]
23+
subjectAltName = @alt_names
24+
# Extensions to add to a certificate request
25+
basicConstraints = CA:FALSE
26+
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
27+
28+
[ issuer_info ]
29+
OCSP;URI.0 = http://ocsp.example.com/
30+
caIssuers;URI.0 = http://example.com/ca.cert
31+
32+
[ alt_names ]
33+
IP.1 = 127.0.0.1
34+
IP.2 = ::1
35+
DNS.1 = localhost

test/https_agent.test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ describe('test/https_agent.test.js', () => {
5656
agent: agentkeepalive,
5757
port,
5858
path: '/',
59-
rejectUnauthorized: false,
59+
ca: fs.readFileSync(__dirname + '/fixtures/ca.pem'),
6060
}, res => {
6161
assert(res.statusCode === 200);
6262
res.resume();
@@ -76,7 +76,7 @@ describe('test/https_agent.test.js', () => {
7676
agent: agentkeepalive,
7777
port,
7878
path: '/',
79-
rejectUnauthorized: false,
79+
ca: fs.readFileSync(__dirname + '/fixtures/ca.pem'),
8080
}, res => {
8181
assert(res.statusCode === 200);
8282
res.resume();

test/test-https-ipv6.test.js

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
'use strict';
2+
3+
const https = require('https');
4+
const assert = require('assert');
5+
const fs = require('fs');
6+
const constants = require('constants');
7+
const HttpsAgent = require('..').HttpsAgent;
8+
const os = require('os');
9+
10+
function isIPv6Available() {
11+
const networkInterfaces = os.networkInterfaces();
12+
return !!Object.keys(networkInterfaces).find(ifName => {
13+
const addresses = networkInterfaces[ifName];
14+
return !!addresses.find(addr => addr.family === 'IPv6');
15+
});
16+
}
17+
18+
describe('test/test-ipv6.test.js', () => {
19+
let port;
20+
let server;
21+
const httpsAgent = new HttpsAgent({
22+
keepAlive: true,
23+
});
24+
const options = {
25+
key: fs.readFileSync(__dirname + '/fixtures/agenttest-key.pem'),
26+
cert: fs.readFileSync(__dirname + '/fixtures/agenttest-cert.pem'),
27+
secureOptions: constants.SSL_OP_NO_TICKET,
28+
};
29+
30+
before(function(done) {
31+
if (!isIPv6Available()) {
32+
this.skip();
33+
}
34+
35+
// Create TLS1.2 server
36+
server = https.createServer(options, (req, res) => {
37+
res.end('ohai');
38+
});
39+
server.listen(0, () => {
40+
port = server.address().port;
41+
done();
42+
});
43+
});
44+
45+
it('should GET / success with 200 status from ::1', function(done) {
46+
const m = process.version.match(/^v(\d+)\.(\d+)/);
47+
const major = parseInt(m[1]);
48+
const minor = parseInt(m[2]);
49+
if (major < 8 || (major === 8 && minor < 10) || (major === 9 && minor < 1)) {
50+
// This only works in node-versions with the fix for
51+
// https://github.com/nodejs/node/issues/14736 included.
52+
this.skip();
53+
}
54+
55+
https.get({
56+
agent: httpsAgent,
57+
hostname: '::1',
58+
port,
59+
path: '/',
60+
ca: fs.readFileSync(__dirname + '/fixtures/ca.pem'),
61+
}, res => {
62+
assert(res.statusCode === 200);
63+
res.resume();
64+
res.on('end', () => {
65+
process.nextTick(() => {
66+
assert(Object.keys(httpsAgent.sockets).length === 0);
67+
assert(Object.keys(httpsAgent.freeSockets).length === 1);
68+
done();
69+
});
70+
});
71+
});
72+
assert(Object.keys(httpsAgent.sockets).length === 1);
73+
});
74+
75+
it('should not crash with invalid host-header', done => {
76+
https.get({
77+
agent: httpsAgent,
78+
hostname: '::1',
79+
port,
80+
path: '/',
81+
headers: {
82+
host: '[::1:80',
83+
},
84+
rejectUnauthorized: false,
85+
}, () => {
86+
done();
87+
});
88+
});
89+
90+
});

0 commit comments

Comments
 (0)