bugfix: 解析IPv6时,hostname和port有误的问题修复。 (#284)
parent
4c7be0dc71
commit
d69c25de26
|
@ -19,6 +19,29 @@ let socketId = 0
|
|||
|
||||
let httpsOverHttpAgent, httpOverHttpsAgent, httpsOverHttpsAgent
|
||||
|
||||
util.parseHostnameAndPort = (host, defaultPort) => {
|
||||
let arr = host.match(/^(\[[^\]]+\])(?::(\d+))?$/) // 尝试解析IPv6
|
||||
if (arr) {
|
||||
arr = arr.slice(1)
|
||||
if (arr[1]) {
|
||||
arr[1] = parseInt(arr[1], 10)
|
||||
}
|
||||
} else {
|
||||
arr = host.split(':')
|
||||
if (arr.length > 1) {
|
||||
arr[1] = parseInt(arr[1], 10)
|
||||
}
|
||||
}
|
||||
|
||||
if (defaultPort > 0 && (arr.length === 1 || arr[1] === undefined)) {
|
||||
arr[1] = defaultPort
|
||||
} else if (arr.length === 2 && arr[1] === undefined) {
|
||||
arr.pop()
|
||||
}
|
||||
|
||||
return arr
|
||||
}
|
||||
|
||||
util.getOptionsFromRequest = (req, ssl, externalProxy = null) => {
|
||||
// eslint-disable-next-line node/no-deprecated-api
|
||||
const urlObject = url.parse(req.url)
|
||||
|
@ -57,16 +80,22 @@ util.getOptionsFromRequest = (req, ssl, externalProxy = null) => {
|
|||
agent = util.getTunnelAgent(protocol === 'https:', externalProxyUrl)
|
||||
}
|
||||
|
||||
// 解析host和port
|
||||
const arr = util.parseHostnameAndPort(urlObject.host)
|
||||
|
||||
// 初始化options
|
||||
const options = {
|
||||
protocol: protocol,
|
||||
hostname: req.headers.host.split(':')[0],
|
||||
hostname: arr[0],
|
||||
method: req.method,
|
||||
port: req.headers.host.split(':')[1] || defaultPort,
|
||||
port: arr[1] || defaultPort,
|
||||
path: urlObject.path,
|
||||
headers: req.headers,
|
||||
agent: agent
|
||||
}
|
||||
|
||||
log.info('options:', options)
|
||||
|
||||
// eslint-disable-next-line node/no-deprecated-api
|
||||
if (protocol === 'http:' && externalProxyUrl && (url.parse(externalProxyUrl)).protocol === 'http:') {
|
||||
// eslint-disable-next-line node/no-deprecated-api
|
||||
|
|
|
@ -0,0 +1,49 @@
|
|||
const util = require('../src/lib/proxy/common/util')
|
||||
|
||||
let arr
|
||||
|
||||
arr = util.parseHostnameAndPort('www.baidu.com')
|
||||
console.log(arr)
|
||||
console.log(arr.length === 1) // true
|
||||
console.log(arr[0] === 'www.baidu.com') // true
|
||||
|
||||
arr = util.parseHostnameAndPort('www.baidu.com', 80)
|
||||
console.log(arr)
|
||||
console.log(arr.length === 2) // true
|
||||
console.log(arr[0] === 'www.baidu.com') // true
|
||||
console.log(arr[1] === 80) // true
|
||||
|
||||
arr = util.parseHostnameAndPort('www.baidu.com:8080')
|
||||
console.log(arr)
|
||||
console.log(arr.length === 2) // true
|
||||
console.log(arr[0] === 'www.baidu.com') // true
|
||||
console.log(arr[1] === 8080) // true
|
||||
|
||||
arr = util.parseHostnameAndPort('www.baidu.com:8080', 8080)
|
||||
console.log(arr)
|
||||
console.log(arr.length === 2) // true
|
||||
console.log(arr[0] === 'www.baidu.com') // true
|
||||
console.log(arr[1] === 8080) // true
|
||||
|
||||
arr = util.parseHostnameAndPort('[2001:abcd::1]')
|
||||
console.log(arr)
|
||||
console.log(arr.length === 1) // true
|
||||
console.log(arr[0] === '[2001:abcd::1]') // ture
|
||||
|
||||
arr = util.parseHostnameAndPort('[2001:abcd::1]', 80)
|
||||
console.log(arr)
|
||||
console.log(arr.length === 2) // true
|
||||
console.log(arr[0] === '[2001:abcd::1]') // ture
|
||||
console.log(arr[1] === 80) // ture
|
||||
|
||||
arr = util.parseHostnameAndPort('[2001:abcd::1]:8080')
|
||||
console.log(arr)
|
||||
console.log(arr.length === 2) // true
|
||||
console.log(arr[0] === '[2001:abcd::1]') // true
|
||||
console.log(arr[1] === 8080) // ture
|
||||
|
||||
arr = util.parseHostnameAndPort('[2001:abcd::1]:8080', 8080)
|
||||
console.log(arr)
|
||||
console.log(arr.length === 2) // true
|
||||
console.log(arr[0] === '[2001:abcd::1]') // true
|
||||
console.log(arr[1] === 8080) // ture
|
Loading…
Reference in New Issue