Skip to content

Commit 1c7616d

Browse files
luozhang002binghaiwang
authored andcommitted
fix: support ipv6 address when set endpoint (#482)
* fix: support ipv6 address when set endpoint * test: add test case for ipv6
1 parent ec8ae25 commit 1c7616d

File tree

4 files changed

+97
-4
lines changed

4 files changed

+97
-4
lines changed

lib/browser/client.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ const pkg = require('./version');
1717
const dateFormat = require('dateformat');
1818
const bowser = require('bowser');
1919
const signUtils = require('../common/signUtils');
20+
const utils = require('../common/utils');
2021

2122
const globalHttpAgent = new AgentKeepalive();
2223

@@ -341,8 +342,7 @@ proto._getResource = function _getResource(params) {
341342
};
342343

343344
proto._isIP = function _isIP(host) {
344-
const ipv4Regex = /^(\d{1,3}\.){3,3}\d{1,3}$/;
345-
return ipv4Regex.test(host);
345+
return utils._isIP(host)
346346
};
347347

348348
proto._escape = function _escape(name) {

lib/client.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ const pkg = require('../package.json');
1717
const dateFormat = require('dateformat');
1818
const bowser = require('bowser');
1919
const signUtils = require('./common/signUtils');
20+
const utils = require('./common/utils');
2021

2122
const globalHttpAgent = new AgentKeepalive();
2223

@@ -328,8 +329,7 @@ proto._getResource = function _getResource(params) {
328329
};
329330

330331
proto._isIP = function _isIP(host) {
331-
const ipv4Regex = /^(\d{1,3}\.){3,3}\d{1,3}$/;
332-
return ipv4Regex.test(host);
332+
return utils._isIP(host)
333333
};
334334

335335
proto._escape = function _escape(name) {

lib/common/utils.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
2+
// it provide commont methods for node and browser , we will add more solutions later in this file
3+
4+
/**
5+
* Judge isIP include ipv4 or ipv6
6+
* @param {String} options
7+
* @return {Array} the multipart uploads
8+
*/
9+
exports._isIP = function(host) {
10+
const ipv4Regex = /^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$/;
11+
const ipv6Regex = /^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/;
12+
const isIP = ipv4Regex.test(host) || ipv6Regex.test(host);
13+
return isIP;
14+
};

test/node/utils.test.js

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
2+
const utils = require('../../lib/common/utils')
3+
const assert = require('assert');
4+
5+
describe('test/utils.test.js', () => {
6+
it('ipv4 test', ()=> {
7+
//first length is 3
8+
assert.equal(utils._isIP("200.255.255.255"),true)
9+
assert.equal(utils._isIP("223.255.255.255"),true)
10+
assert.equal(utils._isIP("224.255.255.255"),true)
11+
assert.equal(utils._isIP("192.0.0.1"),true)
12+
assert.equal(utils._isIP("127.0.0.1"),true)
13+
assert.equal(utils._isIP("100.0.0.1"),true)
14+
assert.equal(utils._isIP("090.0.0.1"),true)
15+
assert.equal(utils._isIP("009.0.0.1"),true)
16+
assert.equal(utils._isIP("200.001.255.255"),true)
17+
18+
// first length is 1 or 2
19+
assert.equal(utils._isIP("09.255.255.255"),true)
20+
assert.equal(utils._isIP("90.255.255.255"),true)
21+
assert.equal(utils._isIP("00.255.255.255"),true)
22+
assert.equal(utils._isIP("-.0.0.1"),false)
23+
assert.equal(utils._isIP("0.0.0.1"),true)
24+
assert.equal(utils._isIP("1.0.0.1"),true)
25+
26+
// test last 3 byte
27+
assert.equal(utils._isIP("200.0.255.255"),true)
28+
assert.equal(utils._isIP("200.01.255.255"),true)
29+
assert.equal(utils._isIP("200.10.255.255"),true)
30+
assert.equal(utils._isIP("200.256.255.255"),false)
31+
assert.equal(utils._isIP("200.001.255.255"),true)
32+
33+
assert.equal(utils._isIP("200.255.0.255"),true)
34+
assert.equal(utils._isIP("200.255.01.255"),true)
35+
assert.equal(utils._isIP("200.255.10.255"),true)
36+
assert.equal(utils._isIP("200.255.256.255"),false)
37+
assert.equal(utils._isIP("200.255.001.255"),true)
38+
39+
assert.equal(utils._isIP("200.255.255.0"),true)
40+
assert.equal(utils._isIP("200.255.255.01"),true)
41+
assert.equal(utils._isIP("200.255.255.10"),true)
42+
assert.equal(utils._isIP("200.255.255.256"),false)
43+
assert.equal(utils._isIP("200.255.255.001"),true)
44+
45+
//excetion
46+
assert.equal(utils._isIP("200.255.255.001"),true)
47+
assert.equal(utils._isIP("200"),false)
48+
assert.equal(utils._isIP("200.1"),false)
49+
assert.equal(utils._isIP("200.1.1"),false)
50+
assert.equal(utils._isIP("200.1.1.1.1"),false)
51+
})
52+
it("ipv6 test", () => {
53+
assert.equal(utils._isIP("1:2:3:4:5:6:7::"),true)
54+
assert.equal(utils._isIP("1:2:3:4:5:6:7:8"),true)
55+
assert.equal(utils._isIP("1:2:3:4:5:6::"),true)
56+
assert.equal(utils._isIP("1:2:3:4:5:6::8"),true)
57+
assert.equal(utils._isIP("1:2:3:4:5::"),true)
58+
assert.equal(utils._isIP("1:2:3:4:5::8"),true)
59+
assert.equal(utils._isIP("1:2:3:4::"),true)
60+
assert.equal(utils._isIP("1:2:3:4::8"),true)
61+
assert.equal(utils._isIP("1:2:3::"),true)
62+
assert.equal(utils._isIP("1:2:3::8"),true)
63+
assert.equal(utils._isIP("1:2::"),true)
64+
assert.equal(utils._isIP("1:2::8"),true)
65+
assert.equal(utils._isIP("1::"),true)
66+
assert.equal(utils._isIP("1::8"),true)
67+
assert.equal(utils._isIP("::"),true)
68+
assert.equal(utils._isIP("::8"),true)
69+
assert.equal(utils._isIP("::7:8"),true)
70+
assert.equal(utils._isIP("::6:7:8"),true)
71+
assert.equal(utils._isIP("::5:6:7:8"),true)
72+
assert.equal(utils._isIP("::4:5:6:7:8"),true)
73+
assert.equal(utils._isIP("::3:4:5:6:7:8"),true)
74+
assert.equal(utils._isIP("::2:3:4:5:6:7:8"),true)
75+
assert.equal(utils._isIP("A:0f:0F:FFFF:5:6:7:8"),true)
76+
assert.equal(utils._isIP("A:0f:0F:FFFF1:5:6:7:8"),false)
77+
assert.equal(utils._isIP("G:0f:0F:FFFF:5:6:7:8"),false)
78+
})
79+
})

0 commit comments

Comments
 (0)