Skip to content

Commit

Permalink
feature: 新增 response 拦截器,目前暂时只支持替换响应头 (#295)
Browse files Browse the repository at this point in the history
  • Loading branch information
wangliang181230 committed Apr 13, 2024
1 parent 5d61e4d commit 97de211
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 1 deletion.
69 changes: 69 additions & 0 deletions packages/mitmproxy/src/lib/interceptor/impl/res/response.js
Original file line number Diff line number Diff line change
@@ -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
}
}
3 changes: 2 additions & 1 deletion packages/mitmproxy/src/lib/interceptor/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -22,5 +23,5 @@ module.exports = [
proxy, sni,

// response interceptor impls
cacheRes, script
cacheRes, script, response
]

0 comments on commit 97de211

Please sign in to comment.