diff --git a/packages/mitmproxy/src/lib/interceptor/impl/res/response.js b/packages/mitmproxy/src/lib/interceptor/impl/res/response.js new file mode 100644 index 00000000..c924a409 --- /dev/null +++ b/packages/mitmproxy/src/lib/interceptor/impl/res/response.js @@ -0,0 +1,69 @@ +const lodash = require('lodash') + +function replaceHeaders (newHeaders, res, proxyRes) { + if (newHeaders && !lodash.isEmpty(newHeaders)) { + // 响应头Key统一转小写 + for (const headerKey in newHeaders) { + if (headerKey === headerKey.toLowerCase()) { + continue + } + + const value = newHeaders[headerKey] + delete newHeaders[headerKey] + newHeaders[headerKey.toLowerCase()] = value + } + + // 原先响应头 + const preHeaders = {} + + // 替换响应头 + for (let i = 0; i < proxyRes.rawHeaders.length; i += 2) { + const headerKey = proxyRes.rawHeaders[i] + const headerKeyLower = headerKey.toLowerCase() + + const newHeaderValue = newHeaders[headerKeyLower] + if (newHeaderValue) { + preHeaders[headerKeyLower] = proxyRes.rawHeaders[i + 1] // 先保存原先响应头 + + proxyRes.rawHeaders[i + 1] = newHeaderValue + delete newHeaders[headerKeyLower] + } + } + // 新增响应头 + for (const headerKey in newHeaders) { + res.setHeader(headerKey, newHeaders[headerKey]) + preHeaders[headerKey] = null // 标记原先响应头为null + } + + // 返回原先响应头 + return preHeaders + } + + return null +} + +module.exports = { + name: 'response', + priority: 203, + replaceHeaders, + responseIntercept (context, interceptOpt, req, res, proxyReq, proxyRes, ssl, next) { + const { log } = context + + const responseConfig = interceptOpt.response + + let actions = '' + + // 替换响应头 + if (replaceHeaders(responseConfig.headers, res, proxyRes)) { + actions += 'headers' + } + + if (actions) { + res.setHeader('DS-Response-Interceptor', actions) + log.info('response intercept: ' + actions) + } + }, + is (interceptOpt) { + return !!interceptOpt.response + } +} diff --git a/packages/mitmproxy/src/lib/interceptor/index.js b/packages/mitmproxy/src/lib/interceptor/index.js index 8f4a7226..f8d592a9 100644 --- a/packages/mitmproxy/src/lib/interceptor/index.js +++ b/packages/mitmproxy/src/lib/interceptor/index.js @@ -13,6 +13,7 @@ const sni = require('./impl/req/sni') // response interceptor impls const cacheRes = require('./impl/res/cacheRes') const script = require('./impl/res/script') +const response = require('./impl/res/response') module.exports = [ // request interceptor impls @@ -22,5 +23,5 @@ module.exports = [ proxy, sni, // response interceptor impls - cacheRes, script + cacheRes, script, response ]