diff --git a/packages/mitmproxy/src/options.js b/packages/mitmproxy/src/options.js index 767cb2c4..602873d8 100644 --- a/packages/mitmproxy/src/options.js +++ b/packages/mitmproxy/src/options.js @@ -4,6 +4,7 @@ const log = require('./utils/util.log') const matchUtil = require('./utils/util.match') const path = require('path') const fs = require('fs') +const lodash = require('lodash') const scriptInterceptor = require('./lib/interceptor/impl/res/script') const { getTmpPacFilePath, downloadPacAsync, createOverwallMiddleware } = require('./lib/proxy/middleware/overwall') @@ -16,6 +17,25 @@ function buildIntercepts (intercepts) { return intercepts } +// 从拦截器配置中,获取exclusions字段,返回数组类型 +function getExclusionArray (exclusions) { + let ret = null + if (Array.isArray(exclusions)) { + if (exclusions.length > 0) { + ret = exclusions + } + } else if (lodash.isObject(exclusions)) { + ret = [] + for (const exclusion in exclusions) { + ret.push(exclusion) + } + if (ret.length === 0) { + return null + } + } + return ret +} + module.exports = (serverConfig) => { const intercepts = matchUtil.domainMapRegexply(buildIntercepts(serverConfig.intercepts)) const whiteList = matchUtil.domainMapRegexply(serverConfig.whiteList) @@ -118,13 +138,20 @@ module.exports = (serverConfig) => { // 添加exclusions字段,用于排除某些路径 // @since 1.8.5 - if (Array.isArray(interceptOpt.exclusions) && interceptOpt.exclusions.length > 0) { + if (interceptOpt.exclusions) { let isExcluded = false - for (const exclusion of interceptOpt.exclusions) { - if (matchUtil.isMatched(rOptions.path, exclusion)) { - log.debug(`拦截器配置排除了path:${rOptions.protocol}//${rOptions.hostname}:${rOptions.port}${rOptions.path}, exclusion: '${exclusion}', interceptOpt:`, interceptOpt) - isExcluded = true + try { + const exclusions = getExclusionArray(interceptOpt.exclusions) + if (exclusions) { + for (const exclusion of exclusions) { + if (matchUtil.isMatched(rOptions.path, exclusion)) { + log.debug(`拦截器配置排除了path:${rOptions.protocol}//${rOptions.hostname}:${rOptions.port}${rOptions.path}, exclusion: '${exclusion}', interceptOpt:`, interceptOpt) + isExcluded = true + } + } } + } catch (e) { + log.error(`判断拦截器是否排除当前path时出现异常, path: ${rOptions.path}, interceptOpt:`, interceptOpt, ', error:', e) } if (isExcluded) { continue