日志优化;拦截配置优化。
parent
6e88d434c8
commit
d2ae69a062
|
@ -283,13 +283,6 @@ module.exports = {
|
|||
abort: true,
|
||||
desc: '广告拦截'
|
||||
}
|
||||
},
|
||||
'*': {
|
||||
'^.*\\?DS_DOWNLOAD$': {
|
||||
requestReplace: { doDownload: true },
|
||||
responseReplace: { doDownload: true },
|
||||
desc: '下载请求拦截:移除请求地址中的 `?DS_DOWNLOAD`,并设置响应头 `Content-Disposition: attachment; filename=xxxx`,使浏览器强制执行下载逻辑,而不是在浏览器中浏览。'
|
||||
}
|
||||
}
|
||||
},
|
||||
// 预设置IP列表
|
||||
|
|
|
@ -8,6 +8,7 @@ const dnsLookup = require('./dnsLookup')
|
|||
function isSslConnect (sslConnectInterceptors, req, cltSocket, head) {
|
||||
for (const intercept of sslConnectInterceptors) {
|
||||
const ret = intercept(req, cltSocket, head)
|
||||
log.debug(`拦截判断结果:${ret}, url: ${req.url}, intercept:`, intercept)
|
||||
if (ret === false || ret === true) {
|
||||
return ret
|
||||
}
|
||||
|
|
|
@ -82,21 +82,26 @@ module.exports = {
|
|||
)
|
||||
|
||||
// 创建监听方法,用于监听 http 和 https 两个端口
|
||||
const printDebugLog = false && process.env.NODE_ENV === 'development' // 开发过程中,如有需要可以将此参数临时改为true,打印所有事件的日志
|
||||
const serverListen = (server, ssl, port, host) => {
|
||||
server.listen(port, host, () => {
|
||||
log.info(`dev-sidecar启动 ${ssl ? 'https' : 'http'} 端口: ${host}:${port}`)
|
||||
server.on('request', (req, res) => {
|
||||
log.debug(`【server request, ssl: ${ssl}】\r\n----- req -----\r\n`, req, '\r\n----- res -----\r\n', res)
|
||||
if (printDebugLog) log.debug(`【server request, ssl: ${ssl}】\r\n----- req -----\r\n`, req, '\r\n----- res -----\r\n', res)
|
||||
requestHandler(req, res, ssl)
|
||||
})
|
||||
// tunneling for https
|
||||
server.on('connect', (req, cltSocket, head) => {
|
||||
log.debug(`【server connect, ssl: ${ssl}】\r\n----- req -----\r\n`, req, '\r\n----- cltSocket -----\r\n', cltSocket, '\r\n----- head -----\r\n', head)
|
||||
if (printDebugLog) log.debug(`【server connect, ssl: ${ssl}】\r\n----- req -----\r\n`, req, '\r\n----- cltSocket -----\r\n', cltSocket, '\r\n----- head -----\r\n', head)
|
||||
connectHandler(req, cltSocket, head, ssl)
|
||||
})
|
||||
// TODO: handler WebSocket
|
||||
server.on('upgrade', function (req, cltSocket, head) {
|
||||
log.debug(`【server upgrade, ssl: ${ssl}】\r\n----- req -----\r\n`, req)
|
||||
if (printDebugLog) {
|
||||
log.debug(`【server upgrade, ssl: ${ssl}】\r\n----- req -----\r\n`, req)
|
||||
} else {
|
||||
log.info(`【server upgrade, ssl: ${ssl}】`, req.url)
|
||||
}
|
||||
upgradeHandler(req, cltSocket, head, ssl)
|
||||
})
|
||||
server.on('error', (err) => {
|
||||
|
@ -109,7 +114,7 @@ module.exports = {
|
|||
})
|
||||
|
||||
// 其他事件:仅记录debug日志
|
||||
if (process.env.NODE_ENV === 'development') {
|
||||
if (printDebugLog) {
|
||||
server.on('close', () => {
|
||||
log.debug(`【server close, ssl: ${ssl}】no arguments...`)
|
||||
})
|
||||
|
|
|
@ -115,17 +115,18 @@ module.exports = class FakeServersCenter {
|
|||
}
|
||||
serverPromiseObj.serverObj = serverObj
|
||||
|
||||
const printDebugLog = false && process.env.NODE_ENV === 'development' // 开发过程中,如有需要可以将此参数临时改为true,打印所有事件的日志
|
||||
fakeServer.listen(0, () => {
|
||||
const address = fakeServer.address()
|
||||
serverObj.port = address.port
|
||||
})
|
||||
fakeServer.on('request', (req, res) => {
|
||||
log.debug(`【fakeServer request - ${hostname}:${port}】\r\n----- req -----\r\n`, req, '\r\n----- res -----\r\n', res)
|
||||
if (printDebugLog) log.debug(`【fakeServer request - ${hostname}:${port}】\r\n----- req -----\r\n`, req, '\r\n----- res -----\r\n', res)
|
||||
this.requestHandler(req, res, ssl)
|
||||
})
|
||||
let once = true
|
||||
fakeServer.on('listening', () => {
|
||||
log.debug(`【fakeServer listening - ${hostname}:${port}】no arguments...`)
|
||||
if (printDebugLog) log.debug(`【fakeServer listening - ${hostname}:${port}】no arguments...`)
|
||||
if (cert && once) {
|
||||
once = false
|
||||
let newMappingHostNames = tlsUtils.getMappingHostNamesFromCert(cert)
|
||||
|
@ -138,7 +139,7 @@ module.exports = class FakeServersCenter {
|
|||
resolve(serverObj)
|
||||
})
|
||||
fakeServer.on('upgrade', (req, socket, head) => {
|
||||
if (process.env.NODE_ENV === 'development') {
|
||||
if (printDebugLog) {
|
||||
log.debug(`【fakeServer upgrade - ${hostname}:${port}】\r\n----- req -----\r\n`, req, '\r\n----- socket -----\r\n', socket, '\r\n----- head -----\r\n', head)
|
||||
} else {
|
||||
log.info(`【fakeServer upgrade - ${hostname}:${port}】`, req.url)
|
||||
|
@ -176,7 +177,7 @@ module.exports = class FakeServersCenter {
|
|||
}
|
||||
|
||||
// 其他监听事件,只打印debug日志
|
||||
if (process.env.NODE_ENV === 'development') {
|
||||
if (printDebugLog) {
|
||||
if (ssl) {
|
||||
fakeServer.on('keylog', (line, tlsSocket) => {
|
||||
log.debug(`【fakeServer keylog - ${hostname}:${port}】\r\n----- line -----\r\n`, line, '\r\n----- tlsSocket -----\r\n', tlsSocket)
|
||||
|
|
|
@ -106,16 +106,21 @@ module.exports = (serverConfig) => {
|
|||
middlewares,
|
||||
sslConnectInterceptor: (req, cltSocket, head) => {
|
||||
const hostname = req.url.split(':')[0]
|
||||
|
||||
// 配置了白名单的域名,将跳过代理
|
||||
const inWhiteList = matchUtil.matchHostname(whiteList, hostname, 'in whiteList') != null
|
||||
if (inWhiteList) {
|
||||
log.info(`为白名单域名,不拦截: ${hostname}, headers:`, req.headers)
|
||||
return false // 所有都不拦截
|
||||
return false // 不拦截
|
||||
}
|
||||
|
||||
// 配置了拦截的域名,将会被代理
|
||||
const matched = !!matchUtil.matchHostname(intercepts, hostname, 'matched intercepts')
|
||||
if (matched === true) {
|
||||
return matched // 拦截
|
||||
const matched = matchUtil.matchHostname(intercepts, hostname, 'matched intercepts')
|
||||
if ((!!matched) === true) {
|
||||
log.debug(`拦截器拦截:${req.url}, matched:`, matched)
|
||||
return true // 拦截
|
||||
}
|
||||
|
||||
return null // 未匹配到任何拦截配置,由下一个拦截器判断
|
||||
},
|
||||
createIntercepts: (context) => {
|
||||
|
|
|
@ -77,25 +77,15 @@ function matchHostname (hostMap, hostname, action) {
|
|||
}
|
||||
|
||||
// 通配符匹配 或 正则表达式匹配
|
||||
for (const target in hostMap) {
|
||||
if (target === 'origin') {
|
||||
for (const regexp in hostMap) {
|
||||
if (regexp === 'origin') {
|
||||
continue
|
||||
}
|
||||
|
||||
// if (target.indexOf('*') < 0 && target[0] !== '^') {
|
||||
// continue // 不是通配符匹配串,也不是正则表达式,跳过
|
||||
// }
|
||||
|
||||
// 如果是通配符匹配串,转换为正则表达式
|
||||
let regexp = target
|
||||
// if (target[0] !== '^') {
|
||||
// regexp = domainRegexply(regexp)
|
||||
// }
|
||||
|
||||
// 正则表达式匹配
|
||||
if (hostname.match(regexp)) {
|
||||
value = hostMap[target]
|
||||
log.info(`matchHostname: ${action}: '${hostname}' -> '${target}': ${JSON.stringify(value)}`)
|
||||
value = hostMap[regexp]
|
||||
log.info(`matchHostname: ${action}: '${hostname}' -> { "${regexp}": ${JSON.stringify(value)} }`)
|
||||
return value
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue