diff --git a/packages/mitmproxy/src/lib/proxy/common/util.js b/packages/mitmproxy/src/lib/proxy/common/util.js index 21d59416..ae383999 100644 --- a/packages/mitmproxy/src/lib/proxy/common/util.js +++ b/packages/mitmproxy/src/lib/proxy/common/util.js @@ -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 diff --git a/packages/mitmproxy/test/utilTest.js b/packages/mitmproxy/test/utilTest.js new file mode 100644 index 00000000..9366b874 --- /dev/null +++ b/packages/mitmproxy/test/utilTest.js @@ -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