From 83276a328fff5b86074f6b4534339fa9d10d4beb Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Fri, 13 Nov 2020 14:36:00 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E6=94=AF=E6=8C=81=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/gui/src/bridge/index.js | 4 ++ packages/gui/src/view/api.js | 19 +++++---- packages/gui/src/view/mixins/plugin.js | 7 ++-- packages/gui/src/view/modules/error/index.js | 4 +- packages/gui/src/view/modules/update/index.js | 8 ++-- packages/gui/src/view/pages/index.vue | 4 +- packages/gui/src/view/pages/server.vue | 6 +++ packages/gui/src/view/status.js | 2 +- packages/mitmproxy/src/index.js | 26 ++++++------ packages/mitmproxy/src/lib/dns/base.js | 8 ++-- packages/mitmproxy/src/lib/dns/https.js | 10 ++--- .../src/lib/interceptor/impl/abort.js | 22 +++++----- .../src/lib/interceptor/impl/proxy.js | 39 +++++++++--------- .../src/lib/interceptor/impl/redirect.js | 33 ++++++++------- .../mitmproxy/src/lib/interceptor/index.js | 5 ++- packages/mitmproxy/src/lib/proxy/bin/index.js | 32 --------------- .../mitmproxy/src/lib/proxy/common/util.js | 4 +- .../proxy/mitmproxy/createConnectHandler.js | 13 +++--- .../proxy/mitmproxy/createFakeServerCenter.js | 4 +- .../proxy/mitmproxy/createRequestHandler.js | 40 ++++++++++++------- .../proxy/mitmproxy/createUpgradeHandler.js | 11 +++-- .../src/lib/proxy/mitmproxy/index.js | 14 +++---- .../src/lib/proxy/tls/FakeServersCenter.js | 12 +++--- packages/mitmproxy/src/options.js | 5 ++- packages/mitmproxy/src/utils/util.js | 3 +- packages/mitmproxy/src/utils/util.log.js | 8 ++++ 26 files changed, 178 insertions(+), 165 deletions(-) delete mode 100644 packages/mitmproxy/src/lib/proxy/bin/index.js create mode 100644 packages/mitmproxy/src/utils/util.log.js diff --git a/packages/gui/src/bridge/index.js b/packages/gui/src/bridge/index.js index abe5d02a..91a528f5 100644 --- a/packages/gui/src/bridge/index.js +++ b/packages/gui/src/bridge/index.js @@ -31,6 +31,9 @@ const localApi = { return { version: pk.version } + }, + getConfigDir () { + return getDefaultConfigBasePath() } }, /** @@ -81,6 +84,7 @@ const localApi = { */ save (newConfig) { // 对比默认config的异同 + DevSidecar.api.config.set(newConfig) const defConfig = DevSidecar.api.config.getDefault() const saveConfig = doMerge(defConfig, newConfig) fs.writeFileSync(_getConfigPath(), JSON5.stringify(saveConfig, null, 2)) diff --git a/packages/gui/src/view/api.js b/packages/gui/src/view/api.js index f4db65a6..204185cf 100644 --- a/packages/gui/src/view/api.js +++ b/packages/gui/src/view/api.js @@ -17,13 +17,18 @@ const bindApi = (api, param1) => { }) } const apiObj = { - on (channel, callback) { - ipcRenderer.on(channel, callback) - }, - invoke, - send, - openExternal (href) { - shell.openExternal(href) + ipc: { + on (channel, callback) { + ipcRenderer.on(channel, callback) + }, + invoke, + send, + openExternal (href) { + shell.openExternal(href) + }, + openPath (file) { + shell.openPath(file) + } } } let inited = false diff --git a/packages/gui/src/view/mixins/plugin.js b/packages/gui/src/view/mixins/plugin.js index 74aa0314..e74d4a4f 100644 --- a/packages/gui/src/view/mixins/plugin.js +++ b/packages/gui/src/view/mixins/plugin.js @@ -39,13 +39,14 @@ export default { this.applyLoading = true await this.applyBefore() await this.saveConfig() - if (this.applyAfter) { - await this.applyAfter() - } + await this.applyAfter() this.applyLoading = false }, async applyBefore () { + }, + async applyAfter () { + }, resetDefault () { const key = this.getKey() diff --git a/packages/gui/src/view/modules/error/index.js b/packages/gui/src/view/modules/error/index.js index d8fd718c..a73354d6 100644 --- a/packages/gui/src/view/modules/error/index.js +++ b/packages/gui/src/view/modules/error/index.js @@ -1,12 +1,12 @@ function install (app, api) { - api.on('error.core', (event, message) => { + api.ipc.on('error.core', (event, message) => { console.error('view on error', message) const key = message.key if (key === 'server') { handleServerStartError(message, message.error, app, api) } }) - api.on('error', (event, message) => { + api.ipc.on('error', (event, message) => { console.error('error', event, message) }) } diff --git a/packages/gui/src/view/modules/update/index.js b/packages/gui/src/view/modules/update/index.js index 28f6fed4..376911ea 100644 --- a/packages/gui/src/view/modules/update/index.js +++ b/packages/gui/src/view/modules/update/index.js @@ -1,6 +1,6 @@ let updateParams = { } function install (app, api) { - api.on('update', (event, message) => { + api.ipc.on('update', (event, message) => { console.log('on message', event, message) handleUpdateMessage(message, app) }) @@ -8,13 +8,13 @@ function install (app, api) { api.update = { checkForUpdate (params) { updateParams = params || { fromUser: false, autoDownload: true, progress: 0 } - api.send('update', { key: 'checkForUpdate' }) + api.ipc.send('update', { key: 'checkForUpdate' }) }, downloadUpdate () { - api.send('update', { key: 'downloadUpdate' }) + api.ipc.send('update', { key: 'downloadUpdate' }) }, doUpdateNow () { - api.send('update', { key: 'doUpdateNow' }) + api.ipc.send('update', { key: 'doUpdateNow' }) } } diff --git a/packages/gui/src/view/pages/index.vue b/packages/gui/src/view/pages/index.vue index 4ed70549..95b78d44 100644 --- a/packages/gui/src/view/pages/index.vue +++ b/packages/gui/src/view/pages/index.vue @@ -45,7 +45,7 @@
如果它解决了你的问题,请不要吝啬你的star哟!
star - GitHub stars + GitHub stars
@@ -233,7 +233,7 @@ export default { this.$api.update.checkForUpdate(this.update) }, openExternal (url) { - this.$api.openExternal(url) + this.$api.ipc.openExternal(url) } } } diff --git a/packages/gui/src/view/pages/server.vue b/packages/gui/src/view/pages/server.vue index 5b9e92eb..2bd41921 100644 --- a/packages/gui/src/view/pages/server.vue +++ b/packages/gui/src/view/pages/server.vue @@ -25,6 +25,8 @@ 当前未启动 + + 日志 @@ -132,6 +134,10 @@ export default { }, addDnsMapping () { this.dnsMappings.unshift({ key: '', value: 'usa' }) + }, + async openLog () { + const dir = await this.$api.info.getConfigDir() + this.$api.ipc.openPath(dir + '/logs/server.log') } } } diff --git a/packages/gui/src/view/status.js b/packages/gui/src/view/status.js index b54040f3..47942f62 100644 --- a/packages/gui/src/view/status.js +++ b/packages/gui/src/view/status.js @@ -12,7 +12,7 @@ const status = { } } async function install (api) { - api.on('status', (event, message) => { + api.ipc.on('status', (event, message) => { console.log('view on status', event, message) const value = message.value const key = message.key diff --git a/packages/mitmproxy/src/index.js b/packages/mitmproxy/src/index.js index 5a34f382..f19df554 100644 --- a/packages/mitmproxy/src/index.js +++ b/packages/mitmproxy/src/index.js @@ -1,7 +1,7 @@ const mitmproxy = require('./lib/proxy') const ProxyOptions = require('./options') const config = require('./lib/proxy/common/config') - +const log = require('./utils/util.log') function fireError (e) { process.send({ type: 'error', event: e }) } @@ -13,28 +13,28 @@ let server function registerProcessListener () { process.on('message', function (msg) { - console.log('child get msg: ' + JSON.stringify(msg)) + log.info('child get msg: ' + JSON.stringify(msg)) if (msg.type === 'action') { api[msg.event.key](msg.event.params) } }) process.on('SIGINT', () => { - console.log('on sigint : closed ') + log.info('on sigint : closed ') process.exit(0) }) // 避免异常崩溃 process.on('uncaughtException', function (err) { if (err.code === 'ECONNABORTED') { - // console.error(err.errno) + // log.error(err.errno) return } - console.error('uncaughtException:', err) + log.error('uncaughtException:', err) }) process.on('unhandledRejection', (reason, p) => { - console.log('Unhandled Rejection at: Promise', p, 'reason:', reason) + log.info('Unhandled Rejection at: Promise', p, 'reason:', reason) // application specific logging, throwing an error, or other logic here }) } @@ -49,17 +49,17 @@ const api = { } const newServer = mitmproxy.createProxy(proxyOptions, () => { fireStatus(true) - console.log('代理服务已启动:127.0.0.1:' + proxyOptions.port) + log.info('代理服务已启动:127.0.0.1:' + proxyOptions.port) }) newServer.on('close', () => { - console.log('server will closed ') + log.info('server will closed ') if (server === newServer) { server = null fireStatus(false) } }) newServer.on('error', (e) => { - console.log('server error', e) + log.info('server error', e) // newServer = null fireError(e) }) @@ -72,20 +72,20 @@ const api = { if (server) { server.close((err) => { if (err) { - console.log('close error', err, ',', err.code, ',', err.message, ',', err.errno) + log.info('close error', err, ',', err.code, ',', err.message, ',', err.errno) if (err.code === 'ERR_SERVER_NOT_RUNNING') { - console.log('代理服务关闭成功') + log.info('代理服务关闭成功') resolve() return } reject(err) } else { - console.log('代理服务关闭成功') + log.info('代理服务关闭成功') resolve() } }) } else { - console.log('server is null') + log.info('server is null') fireStatus(false) resolve() } diff --git a/packages/mitmproxy/src/lib/dns/base.js b/packages/mitmproxy/src/lib/dns/base.js index 5a70932c..5b27ce64 100644 --- a/packages/mitmproxy/src/lib/dns/base.js +++ b/packages/mitmproxy/src/lib/dns/base.js @@ -1,8 +1,6 @@ const LRU = require('lru-cache') // const { isIP } = require('validator') -const getLogger = require('../utils/logger') - -const logger = getLogger('dns') +const log = require('../../utils/util.log') const cacheSize = 1024 // eslint-disable-next-line no-unused-vars // function _isIP (v) { @@ -104,11 +102,11 @@ module.exports = class BaseDNS { ipCache.setIpList(ipList) - logger.debug(`[DNS] ${hostname} -> ${ipCache.ip} (${new Date() - t} ms)`) + log.info(`[DNS] ${hostname} -> ${ipCache.ip} (${new Date() - t} ms)`) return ipCache.ip } catch (error) { - logger.debug(`[DNS] cannot resolve hostname ${hostname} (${error})`) + log.error(`[DNS] cannot resolve hostname ${hostname} (${error})`) return hostname } } diff --git a/packages/mitmproxy/src/lib/dns/https.js b/packages/mitmproxy/src/lib/dns/https.js index f11b7071..148f1966 100644 --- a/packages/mitmproxy/src/lib/dns/https.js +++ b/packages/mitmproxy/src/lib/dns/https.js @@ -1,7 +1,7 @@ const { promisify } = require('util') const doh = require('dns-over-http') const BaseDNS = require('./base') - +const log = require('../../utils/util.log') const dohQueryAsync = promisify(doh.query) module.exports = class DNSOverHTTPS extends BaseDNS { @@ -15,18 +15,18 @@ module.exports = class DNSOverHTTPS extends BaseDNS { const result = await dohQueryAsync({ url: this.dnsServer }, [{ type: 'A', name: hostname }]) if (result.answers.length === 0) { // 说明没有获取到ip - console.log('该域名没有ip地址解析', hostname) + log.info('该域名没有ip地址解析', hostname) return [] } const ret = result.answers.filter(item => { return item.type === 'A' }).map(item => { return item.data }) if (ret.length === 0) { - console.log('该域名没有ipv4地址解析', hostname) + log.info('该域名没有ipv4地址解析', hostname) } else { - console.log('获取到域名地址:', hostname, JSON.stringify(ret)) + log.info('获取到域名地址:', hostname, JSON.stringify(ret)) } return ret } catch (err) { - console.log('dns query error', hostname, err) + log.info('dns query error', hostname, err.message) return [] } } diff --git a/packages/mitmproxy/src/lib/interceptor/impl/abort.js b/packages/mitmproxy/src/lib/interceptor/impl/abort.js index b5fb1cef..2b0ade3e 100644 --- a/packages/mitmproxy/src/lib/interceptor/impl/abort.js +++ b/packages/mitmproxy/src/lib/interceptor/impl/abort.js @@ -1,11 +1,15 @@ -module.exports = { - requestInterceptor (interceptOpt, rOptions, req, res, ssl) { - console.log('abort:', rOptions.hostname, req.url) - res.writeHead(403) - res.write('DevSidecar 403: \n\n request abort, this request is matched by abort intercept.\n\n 因配置abort拦截器,本请求将取消') - res.end() - }, - is (interceptOpt) { - return !!interceptOpt.abort + +module.exports = function createIntercept (context) { + const { log } = context + return { + requestInterceptor (interceptOpt, rOptions, req, res, ssl) { + log.info('abort:', rOptions.hostname, req.url) + res.writeHead(403) + res.write('DevSidecar 403: \n\n request abort, this request is matched by abort intercept.\n\n 因配置abort拦截器,本请求将取消') + res.end() + }, + is (interceptOpt) { + return !!interceptOpt.abort + } } } diff --git a/packages/mitmproxy/src/lib/interceptor/impl/proxy.js b/packages/mitmproxy/src/lib/interceptor/impl/proxy.js index 31fe26b7..6fac9371 100644 --- a/packages/mitmproxy/src/lib/interceptor/impl/proxy.js +++ b/packages/mitmproxy/src/lib/interceptor/impl/proxy.js @@ -1,22 +1,25 @@ const url = require('url') -module.exports = { - requestInterceptor (interceptOpt, rOptions, req, res, ssl, next) { - const proxyTarget = interceptOpt.proxy - // const backup = interceptOpt.backup - const proxy = proxyTarget.indexOf('http') === 0 ? proxyTarget : rOptions.protocol + '//' + proxyTarget - // eslint-disable-next-line node/no-deprecated-api - const URL = url.parse(proxy) - rOptions.protocol = URL.protocol - rOptions.hostname = URL.host - rOptions.host = URL.host - rOptions.headers.host = URL.host - if (URL.port == null) { - rOptions.port = rOptions.protocol === 'https:' ? 443 : 80 - } +module.exports = function createInterceptor (context) { + const { log } = context + return { + requestInterceptor (interceptOpt, rOptions, req, res, ssl, next) { + const proxyTarget = interceptOpt.proxy + // const backup = interceptOpt.backup + const proxy = proxyTarget.indexOf('http') === 0 ? proxyTarget : rOptions.protocol + '//' + proxyTarget + // eslint-disable-next-line node/no-deprecated-api + const URL = url.parse(proxy) + rOptions.protocol = URL.protocol + rOptions.hostname = URL.host + rOptions.host = URL.host + rOptions.headers.host = URL.host + if (URL.port == null) { + rOptions.port = rOptions.protocol === 'https:' ? 443 : 80 + } - console.log('proxy:', rOptions.hostname, req.url, proxyTarget) - }, - is (interceptOpt) { - return !!interceptOpt.proxy + log.info('proxy:', rOptions.hostname, req.url, proxyTarget) + }, + is (interceptOpt) { + return !!interceptOpt.proxy + } } } diff --git a/packages/mitmproxy/src/lib/interceptor/impl/redirect.js b/packages/mitmproxy/src/lib/interceptor/impl/redirect.js index e8e3ef61..07d7af84 100644 --- a/packages/mitmproxy/src/lib/interceptor/impl/redirect.js +++ b/packages/mitmproxy/src/lib/interceptor/impl/redirect.js @@ -1,18 +1,21 @@ -module.exports = { - requestInterceptor (interceptOpt, rOptions, req, res, ssl) { - const url = req.url - let redirect - if (typeof interceptOpt.redirect === 'string') { - redirect = rOptions.protocol + '//' + interceptOpt.redirect + url - } else { - redirect = interceptOpt.redirect(url) +module.exports = function createInterceptor (context) { + const { log } = context + return { + requestInterceptor (interceptOpt, rOptions, req, res, ssl) { + const url = req.url + let redirect + if (typeof interceptOpt.redirect === 'string') { + redirect = rOptions.protocol + '//' + interceptOpt.redirect + url + } else { + redirect = interceptOpt.redirect(url) + } + log.info('请求重定向:', rOptions.hostname, url, redirect) + res.writeHead(302, { Location: redirect }) + res.end() + return true + }, + is (interceptOpt) { + return interceptOpt.redirect // 如果配置中有redirect,那么这个配置是需要redirect拦截的 } - console.log('请求重定向:', rOptions.hostname, url, redirect) - res.writeHead(302, { Location: redirect }) - res.end() - return true - }, - is (interceptOpt) { - return interceptOpt.redirect // 如果配置中有redirect,那么这个配置是需要redirect拦截的 } } diff --git a/packages/mitmproxy/src/lib/interceptor/index.js b/packages/mitmproxy/src/lib/interceptor/index.js index 6b10e5bb..f072b075 100644 --- a/packages/mitmproxy/src/lib/interceptor/index.js +++ b/packages/mitmproxy/src/lib/interceptor/index.js @@ -1,7 +1,8 @@ const proxy = require('./impl/proxy') const redirect = require('./impl/redirect') const abort = require('./impl/abort') - -const modules = [proxy, redirect, abort] +const log = require('../../utils/util.log') +const context = { log } +const modules = [proxy(context), redirect(context), abort(context)] module.exports = modules diff --git a/packages/mitmproxy/src/lib/proxy/bin/index.js b/packages/mitmproxy/src/lib/proxy/bin/index.js deleted file mode 100644 index a6217de5..00000000 --- a/packages/mitmproxy/src/lib/proxy/bin/index.js +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env node -require('babel-polyfill') -const mitmproxy = require('../mitmproxy') -const program = require('commander') -const packageJson = require('../../package.json') -// const tlsUtils = require('../tls/tlsUtils') -const fs = require('fs') -const path = require('path') -const colors = require('colors') - -fs.existsSync = fs.existsSync || path.existsSync - -program - .version(packageJson.version) - .option('-c, --config [value]', 'config file path') - .parse(process.argv) - -console.log(program.config) - -const configPath = path.resolve(program.config) - -if (fs.existsSync(configPath)) { - const configObject = require(configPath) - - if (typeof configObject !== 'object') { - console.error(colors.red(`Config Error in ${configPath}`)) - } else { - mitmproxy.createProxy(configObject) - } -} else { - console.error(colors.red(`Can not find \`config file\` file: ${configPath}`)) -} diff --git a/packages/mitmproxy/src/lib/proxy/common/util.js b/packages/mitmproxy/src/lib/proxy/common/util.js index 6fa2b769..16b686a6 100644 --- a/packages/mitmproxy/src/lib/proxy/common/util.js +++ b/packages/mitmproxy/src/lib/proxy/common/util.js @@ -2,7 +2,7 @@ const url = require('url') const Agent = require('./ProxyHttpAgent') const HttpsAgent = require('./ProxyHttpsAgent') const tunnelAgent = require('tunnel-agent') - +const log = require('../../../utils/util.log') const util = exports const httpsAgent = new HttpsAgent({ keepAlive: true, @@ -34,7 +34,7 @@ util.getOptionsFormRequest = (req, ssl, externalProxy = null) => { try { externalProxyUrl = externalProxy(req, ssl) } catch (e) { - console.error('externalProxy', e) + log.error('externalProxy', e) } } } diff --git a/packages/mitmproxy/src/lib/proxy/mitmproxy/createConnectHandler.js b/packages/mitmproxy/src/lib/proxy/mitmproxy/createConnectHandler.js index d2a13fc9..db13d452 100644 --- a/packages/mitmproxy/src/lib/proxy/mitmproxy/createConnectHandler.js +++ b/packages/mitmproxy/src/lib/proxy/mitmproxy/createConnectHandler.js @@ -1,5 +1,6 @@ const net = require('net') const url = require('url') +const log = require('../../../utils/util.log') // const colors = require('colors') const DnsUtil = require('../../dns/index') const localIP = '127.0.0.1' @@ -15,7 +16,7 @@ module.exports = function createConnectHandler (sslConnectInterceptor, fakeServe fakeServerCenter.getServerPromise(hostname, srvUrl.port).then((serverObj) => { connect(req, cltSocket, head, localIP, serverObj.port) }, (e) => { - console.error('getServerPromise', e) + log.error('getServerPromise', e) }) } else { connect(req, cltSocket, head, hostname, srvUrl.port, dnsConfig) @@ -25,7 +26,7 @@ module.exports = function createConnectHandler (sslConnectInterceptor, fakeServe function connect (req, cltSocket, head, hostname, port, dnsConfig) { // tunneling https - // console.log('connect:', hostname, port) + // log.info('connect:', hostname, port) const start = new Date().getTime() let isDnsIntercept = null try { @@ -62,21 +63,21 @@ function connect (req, cltSocket, head, hostname, port, dnsConfig) { proxySocket.on('timeout', () => { const end = new Date().getTime() - console.log('代理socket timeout:', hostname, port, (end - start) + 'ms') + log.info('代理socket timeout:', hostname, port, (end - start) + 'ms') }) proxySocket.on('error', (e) => { // 连接失败,可能被GFW拦截,或者服务端拥挤 const end = new Date().getTime() - console.error('代理连接失败:', e.message, hostname, port, (end - start) + 'ms') + log.error('代理连接失败:', e.message, hostname, port, (end - start) + 'ms') cltSocket.destroy() if (isDnsIntercept) { const { dns, ip, hostname } = isDnsIntercept dns.count(hostname, ip, true) - console.error('记录ip失败次数,用于优选ip:', hostname, ip) + log.error('记录ip失败次数,用于优选ip:', hostname, ip) } }) return proxySocket } catch (error) { - console.log('connect err', error) + log.error('connect err', error) } } diff --git a/packages/mitmproxy/src/lib/proxy/mitmproxy/createFakeServerCenter.js b/packages/mitmproxy/src/lib/proxy/mitmproxy/createFakeServerCenter.js index 982c745d..96ef8f9b 100644 --- a/packages/mitmproxy/src/lib/proxy/mitmproxy/createFakeServerCenter.js +++ b/packages/mitmproxy/src/lib/proxy/mitmproxy/createFakeServerCenter.js @@ -2,7 +2,7 @@ const fs = require('fs') const forge = require('node-forge') const FakeServersCenter = require('../tls/FakeServersCenter') const colors = require('colors') - +const log = require('../../../utils/util.log') module.exports = function createFakeServerCenter ({ caCertPath, caKeyPath, @@ -20,7 +20,7 @@ module.exports = function createFakeServerCenter ({ caCert = forge.pki.certificateFromPem(caCertPem) caKey = forge.pki.privateKeyFromPem(caKeyPem) } catch (e) { - console.log(colors.red('Can not find `CA certificate` or `CA key`.'), e) + log.info(colors.red('Can not find `CA certificate` or `CA key`.'), e) process.exit(1) } diff --git a/packages/mitmproxy/src/lib/proxy/mitmproxy/createRequestHandler.js b/packages/mitmproxy/src/lib/proxy/mitmproxy/createRequestHandler.js index 4c2c293e..cd16eb03 100644 --- a/packages/mitmproxy/src/lib/proxy/mitmproxy/createRequestHandler.js +++ b/packages/mitmproxy/src/lib/proxy/mitmproxy/createRequestHandler.js @@ -3,7 +3,7 @@ const https = require('https') const commonUtil = require('../common/util') // const upgradeHeader = /(^|,)\s*upgrade\s*($|,)/i const DnsUtil = require('../../dns/index') - +const log = require('../../../utils/util.log') // create requestHandler function module.exports = function createRequestHandler (requestInterceptor, responseInterceptor, middlewares, externalProxy, dnsConfig) { // return @@ -43,7 +43,7 @@ module.exports = function createRequestHandler (requestInterceptor, responseInte // const dns = DnsUtil.hasDnsLookup(dnsConfig, rOptions.host) // if (dns) { // const ip = await dns.lookup(rOptions.host) - // console.log('使用自定义dns:', rOptions.host, ip, dns.dnsServer) + // log.info('使用自定义dns:', rOptions.host, ip, dns.dnsServer) // rOptions.host = ip // } // } @@ -63,7 +63,7 @@ module.exports = function createRequestHandler (requestInterceptor, responseInte function onFree () { const url = `${rOptions.protocol}//${rOptions.hostname}:${rOptions.port}${rOptions.path}` const start = new Date().getTime() - console.log('代理请求:', url, rOptions.method) + log.info('代理请求:', url, rOptions.method) let isDnsIntercept if (dnsConfig) { const dns = DnsUtil.hasDnsLookup(dnsConfig, rOptions.hostname) @@ -80,11 +80,10 @@ module.exports = function createRequestHandler (requestInterceptor, responseInte } } } - proxyReq = (rOptions.protocol === 'https:' ? https : http).request(rOptions, (proxyRes) => { const end = new Date().getTime() if (rOptions.protocol === 'https:') { - console.log('代理请求返回:', url, (end - start) + 'ms') + log.info('代理请求返回:', url, (end - start) + 'ms') } resolve(proxyRes) }) @@ -94,10 +93,15 @@ module.exports = function createRequestHandler (requestInterceptor, responseInte if (isDnsIntercept) { const { dns, ip, hostname } = isDnsIntercept dns.count(hostname, ip, true) - console.error('记录ip失败次数,用于优选ip:', hostname, ip) + log.error('记录ip失败次数,用于优选ip:', hostname, ip) } - console.error('代理请求超时', rOptions.protocol, rOptions.hostname, rOptions.path, (end - start) + 'ms') - reject(new Error(`${rOptions.host}:${rOptions.port}, 代理请求超时`)) + log.error('代理请求超时', rOptions.protocol, rOptions.hostname, rOptions.path, (end - start) + 'ms') + // reject(new Error(`${rOptions.host}:${rOptions.port}, 代理请求超时`)) + proxyReq.end() + proxyReq.destroy() + res.writeHead(408) + res.write('DevSidecar Warning:\n\n 请求超时') + res.end() }) proxyReq.on('error', (e) => { @@ -105,28 +109,34 @@ module.exports = function createRequestHandler (requestInterceptor, responseInte if (isDnsIntercept) { const { dns, ip, hostname } = isDnsIntercept dns.count(hostname, ip, true) - console.error('记录ip失败次数,用于优选ip:', hostname, ip) + log.error('记录ip失败次数,用于优选ip:', hostname, ip) } - console.error('代理请求错误', e.errno, rOptions.hostname, rOptions.path, (end - start) + 'ms', e) + log.error('代理请求错误', e.code, e.message, rOptions.hostname, rOptions.path, (end - start) + 'ms') reject(e) }) proxyReq.on('aborted', () => { - console.error('代理请求被取消', rOptions.hostname, rOptions.path) + log.error('代理请求被取消', rOptions.hostname, rOptions.path) + if (res.finished) { + return + } reject(new Error('代理请求被取消')) }) req.on('aborted', function () { - console.error('请求被取消', rOptions.hostname, rOptions.path) + log.error('请求被取消', rOptions.hostname, rOptions.path) proxyReq.abort() + if (res.finished) { + return + } reject(new Error('请求被取消')) }) req.on('error', function (e, req, res) { - console.error('请求错误:', e.errno, rOptions.hostname, rOptions.path) + log.error('请求错误:', e.errno, rOptions.hostname, rOptions.path) reject(e) }) req.on('timeout', () => { - console.error('请求超时', rOptions.hostname, rOptions.path) + log.error('请求超时', rOptions.hostname, rOptions.path) reject(new Error(`${rOptions.hostname}:${rOptions.port}, 请求超时`)) }) req.pipe(proxyReq) @@ -191,8 +201,8 @@ module.exports = function createRequestHandler (requestInterceptor, responseInte res.writeHead(500) res.write(`DevSidecar Warning:\n\n ${e.toString()}`) res.end() + log.error('request error', e.message) } - console.error('request error', e.message) } ) } diff --git a/packages/mitmproxy/src/lib/proxy/mitmproxy/createUpgradeHandler.js b/packages/mitmproxy/src/lib/proxy/mitmproxy/createUpgradeHandler.js index 601ec7d5..d54c9848 100644 --- a/packages/mitmproxy/src/lib/proxy/mitmproxy/createUpgradeHandler.js +++ b/packages/mitmproxy/src/lib/proxy/mitmproxy/createUpgradeHandler.js @@ -1,7 +1,7 @@ const http = require('http') const https = require('https') const util = require('../common/util') - +const log = require('../../../utils/util.log') // copy from node-http-proxy. ^_^ // create connectHandler function @@ -11,7 +11,7 @@ module.exports = function createUpgradeHandler () { const clientOptions = util.getOptionsFormRequest(req, ssl) const proxyReq = (ssl ? https : http).request(clientOptions) proxyReq.on('error', (e) => { - console.error(e) + log.error('upgradeHandler', e) }) proxyReq.on('response', function (res) { // if upgrade event isn't going to happen, close the socket @@ -20,12 +20,11 @@ module.exports = function createUpgradeHandler () { proxyReq.on('upgrade', function (proxyRes, proxySocket, proxyHead) { proxySocket.on('error', (e) => { - console.log('error-----1111') - console.error(e) + log.error('on upgrade:', e) }) - cltSocket.on('error', function () { - console.log('error-----2222') + cltSocket.on('error', function (e) { + log.error('upgrade socket ', e) proxySocket.end() }) diff --git a/packages/mitmproxy/src/lib/proxy/mitmproxy/index.js b/packages/mitmproxy/src/lib/proxy/mitmproxy/index.js index 5dfd2dec..e7fd38ee 100644 --- a/packages/mitmproxy/src/lib/proxy/mitmproxy/index.js +++ b/packages/mitmproxy/src/lib/proxy/mitmproxy/index.js @@ -1,7 +1,7 @@ const tlsUtils = require('../tls/tlsUtils') const http = require('http') const config = require('../common/config') -const colors = require('colors') +const log = require('../../../utils/util.log') const createRequestHandler = require('./createRequestHandler') const createConnectHandler = require('./createConnectHandler') const createFakeServerCenter = require('./createFakeServerCenter') @@ -27,8 +27,8 @@ module.exports = { caCertPath = rs.caCertPath caKeyPath = rs.caKeyPath if (rs.create) { - console.log(colors.cyan(`CA Cert saved in: ${caCertPath}`)) - console.log(colors.cyan(`CA private key saved in: ${caKeyPath}`)) + log.info(`CA Cert saved in: ${caCertPath}`) + log.info(`CA private key saved in: ${caKeyPath}`) } } @@ -59,18 +59,18 @@ module.exports = { const server = new http.Server() server.listen(port, () => { - console.log(colors.green(`dev-sidecar启动端口: ${port}`)) + log.info(`dev-sidecar启动端口: ${port}`) server.on('error', (e) => { - console.error(colors.red(e)) + log.error('server error', e) }) server.on('request', (req, res) => { const ssl = false - // console.log('request,', req.url, req.port, req.host) + // log.info('request,', req.url, req.port, req.host) requestHandler(req, res, ssl) }) // tunneling for https server.on('connect', (req, cltSocket, head) => { - // console.log('connect,', req.url) + // log.info('connect,', req.url) connectHandler(req, cltSocket, head) }) // TODO: handler WebSocket diff --git a/packages/mitmproxy/src/lib/proxy/tls/FakeServersCenter.js b/packages/mitmproxy/src/lib/proxy/tls/FakeServersCenter.js index bd2c07ac..7dbc449c 100644 --- a/packages/mitmproxy/src/lib/proxy/tls/FakeServersCenter.js +++ b/packages/mitmproxy/src/lib/proxy/tls/FakeServersCenter.js @@ -5,7 +5,7 @@ const forge = require('node-forge') const pki = forge.pki // const colors = require('colors') const tls = require('tls') - +const log = require('../../../utils/util.log') module.exports = class FakeServersCenter { constructor ({ maxLength = 256, requestHandler, upgradeHandler, caCert, caKey, getCertSocketTimeout }) { this.queue = [] @@ -23,13 +23,13 @@ module.exports = class FakeServersCenter { if (this.queue.length >= this.maxLength) { const delServerObj = this.queue.shift() try { - console.log('超过最大服务数量,删除旧服务', delServerObj) + log.info('超过最大服务数量,删除旧服务', delServerObj) delServerObj.serverObj.server.close() } catch (e) { - console.log(e) + log.info(e) } } - console.log('add server promise:', serverPromiseObj) + log.info('add server promise:', serverPromiseObj) this.queue.push(serverPromiseObj) return serverPromiseObj } @@ -64,7 +64,7 @@ module.exports = class FakeServersCenter { SNICallback: (hostname, done) => { (async () => { const certObj = await this.certAndKeyContainer.getCertPromise(hostname, port) - console.log('sni callback:', hostname) + log.info('sni callback:', hostname) done(null, tls.createSecureContext({ key: pki.privateKeyToPem(certObj.key), cert: pki.certificateToPem(certObj.cert) @@ -88,7 +88,7 @@ module.exports = class FakeServersCenter { this.requestHandler(req, res, ssl) }) fakeServer.on('error', (e) => { - console.error(e) + log.error(e) }) fakeServer.on('listening', () => { const mappingHostNames = tlsUtils.getMappingHostNamesFormCert(certObj.cert) diff --git a/packages/mitmproxy/src/options.js b/packages/mitmproxy/src/options.js index 085b0002..b044879b 100644 --- a/packages/mitmproxy/src/options.js +++ b/packages/mitmproxy/src/options.js @@ -1,6 +1,7 @@ const interceptors = require('./lib/interceptor') const dnsUtil = require('./lib/dns') const lodash = require('lodash') +const log = require('./utils/util.log') function matchHostname (hostMap, hostname) { const value = hostMap[hostname] if (value) { @@ -57,7 +58,7 @@ module.exports = (config) => { const hostname = req.url.split(':')[0] const inWhiteList = matchHostname(whiteList, hostname) != null if (inWhiteList) { - console.log('白名单域名,不拦截', hostname) + log.info('白名单域名,不拦截', hostname) return false } return !!matchHostname(intercepts, hostname) // 配置了拦截的域名,将会被代理 @@ -89,7 +90,7 @@ module.exports = (config) => { } } catch (err) { // 拦截失败 - console.error(err) + log.error('拦截器执行错误', err) } } } diff --git a/packages/mitmproxy/src/utils/util.js b/packages/mitmproxy/src/utils/util.js index 39bb4346..82ea1b26 100644 --- a/packages/mitmproxy/src/utils/util.js +++ b/packages/mitmproxy/src/utils/util.js @@ -1,8 +1,9 @@ const os = require('os') +const log = require('util.log') const util = { getNodeVersion () { const version = process.version - console.log(version) + log.info(version) } } util.getNodeVersion() diff --git a/packages/mitmproxy/src/utils/util.log.js b/packages/mitmproxy/src/utils/util.log.js new file mode 100644 index 00000000..273251c2 --- /dev/null +++ b/packages/mitmproxy/src/utils/util.log.js @@ -0,0 +1,8 @@ +const log4js = require('log4js') +const proxyConfig = require('../lib/proxy/common/config') +log4js.configure({ + appenders: { std: { type: 'stdout' }, file: { type: 'file', pattern: '.yyyy-MM-dd', daysToKeep: 3, filename: proxyConfig.getDefaultCABasePath() + '/logs/server.log' } }, + categories: { default: { appenders: ['file', 'std'], level: 'info' } } +}) +const logger = log4js.getLogger('server') +module.exports = logger