|
@@ -115,14 +115,15 @@ function isProxyTlsHandshakeReset(err) {
|
|
|
async function logSchoolOutbound(logger, phase, url, axiosMerge, opts = {}) {
|
|
async function logSchoolOutbound(logger, phase, url, axiosMerge, opts = {}) {
|
|
|
if (!logger?.info) return
|
|
if (!logger?.info) return
|
|
|
const path = briefUrlPath(url)
|
|
const path = briefUrlPath(url)
|
|
|
|
|
+ const mqPart = opts.mqTaskId ? ` mq_task_id=${opts.mqTaskId}` : ''
|
|
|
if (!axiosMerge || axiosMerge.proxy === false || !axiosMerge.proxy) {
|
|
if (!axiosMerge || axiosMerge.proxy === false || !axiosMerge.proxy) {
|
|
|
- logger.info(`[lepaoSchoolHttp] ${phase} POST 出站=直连 path=${path}`)
|
|
|
|
|
|
|
+ logger.info(`[lepaoSchoolHttp] ${phase} POST 出站=直连${mqPart} path=${path}`)
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
const conn = `${axiosMerge.proxy.host}:${axiosMerge.proxy.port}`
|
|
const conn = `${axiosMerge.proxy.host}:${axiosMerge.proxy.port}`
|
|
|
if (opts.skipQgSnapshot) {
|
|
if (opts.skipQgSnapshot) {
|
|
|
logger.info(
|
|
logger.info(
|
|
|
- `[lepaoSchoolHttp] ${phase} POST 出站=调试HTTP代理(非青果) 连接=${conn} path=${path}`
|
|
|
|
|
|
|
+ `[lepaoSchoolHttp] ${phase} POST 出站=调试HTTP代理(非青果)${mqPart} 连接=${conn} path=${path}`
|
|
|
)
|
|
)
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
@@ -131,7 +132,7 @@ async function logSchoolOutbound(logger, phase, url, axiosMerge, opts = {}) {
|
|
|
const egress = snap?.proxyIp ?? '(暂无 proxy_ip)'
|
|
const egress = snap?.proxyIp ?? '(暂无 proxy_ip)'
|
|
|
const dl = snap?.deadline ?? '—'
|
|
const dl = snap?.deadline ?? '—'
|
|
|
logger.info(
|
|
logger.info(
|
|
|
- `[lepaoSchoolHttp] ${phase} POST 出站=HTTP代理 节点server=${serverRecord} 连接${conn} 出口IP(proxy_ip)=${egress} deadline=${dl} path=${path}`
|
|
|
|
|
|
|
+ `[lepaoSchoolHttp] ${phase} POST 出站=HTTP代理${mqPart} 节点server=${serverRecord} 连接${conn} 出口IP(proxy_ip)=${egress} deadline=${dl} path=${path}`
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -152,7 +153,7 @@ async function postLepaoSchool(url, data, options = {}) {
|
|
|
|
|
|
|
|
// 强制直连:策略 A 用(任务内固定出站,禁止中途切换)
|
|
// 强制直连:策略 A 用(任务内固定出站,禁止中途切换)
|
|
|
if (outboundMode === 'direct') {
|
|
if (outboundMode === 'direct') {
|
|
|
- await logSchoolOutbound(logger, '(强制直连)', url, { proxy: false })
|
|
|
|
|
|
|
+ await logSchoolOutbound(logger, '(强制直连)', url, { proxy: false }, { mqTaskId })
|
|
|
return doPost({ proxy: false })
|
|
return doPost({ proxy: false })
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -165,7 +166,7 @@ async function postLepaoSchool(url, data, options = {}) {
|
|
|
|
|
|
|
|
const qgOn = await QgProxyManager.isOutboundProxyEnabled()
|
|
const qgOn = await QgProxyManager.isOutboundProxyEnabled()
|
|
|
if (!qgOn) {
|
|
if (!qgOn) {
|
|
|
- await logSchoolOutbound(logger, '(青果出站未启用)', url, { proxy: false })
|
|
|
|
|
|
|
+ await logSchoolOutbound(logger, '(青果出站未启用)', url, { proxy: false }, { mqTaskId })
|
|
|
return doPost({ proxy: false })
|
|
return doPost({ proxy: false })
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -206,12 +207,12 @@ async function postLepaoSchool(url, data, options = {}) {
|
|
|
err.retryable = true
|
|
err.retryable = true
|
|
|
throw err
|
|
throw err
|
|
|
}
|
|
}
|
|
|
- await logSchoolOutbound(logger, '(无缓存节点→直连)', url, { proxy: false })
|
|
|
|
|
|
|
+ await logSchoolOutbound(logger, '(无缓存节点→直连)', url, { proxy: false }, { mqTaskId })
|
|
|
await QgProxyManager.recordFallbackDirect({ reason: 'no_proxy_available', mq_task_id: mqTaskId })
|
|
await QgProxyManager.recordFallbackDirect({ reason: 'no_proxy_available', mq_task_id: mqTaskId })
|
|
|
return doPost({ proxy: false })
|
|
return doPost({ proxy: false })
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- await logSchoolOutbound(logger, '首次请求', url, frag)
|
|
|
|
|
|
|
+ await logSchoolOutbound(logger, '首次请求', url, frag, { mqTaskId })
|
|
|
try {
|
|
try {
|
|
|
const proxyFirstTimeoutMs = 20000
|
|
const proxyFirstTimeoutMs = 20000
|
|
|
return await doPost(frag, proxyFirstTimeoutMs)
|
|
return await doPost(frag, proxyFirstTimeoutMs)
|
|
@@ -234,7 +235,7 @@ async function postLepaoSchool(url, data, options = {}) {
|
|
|
logger?.warn?.(
|
|
logger?.warn?.(
|
|
|
'[lepaoSchoolHttp] TLS 握手前经代理断开,隧道池模式直接直连(由服务商后台自动切换出口)'
|
|
'[lepaoSchoolHttp] TLS 握手前经代理断开,隧道池模式直接直连(由服务商后台自动切换出口)'
|
|
|
)
|
|
)
|
|
|
- await logSchoolOutbound(logger, '(TLS隧道异常→直连)', url, { proxy: false })
|
|
|
|
|
|
|
+ await logSchoolOutbound(logger, '(TLS隧道异常→直连)', url, { proxy: false }, { mqTaskId })
|
|
|
await QgProxyManager.recordFallbackDirect({
|
|
await QgProxyManager.recordFallbackDirect({
|
|
|
reason: 'tls_prefinish_reset_direct',
|
|
reason: 'tls_prefinish_reset_direct',
|
|
|
path: briefUrlPath(url),
|
|
path: briefUrlPath(url),
|
|
@@ -244,7 +245,7 @@ async function postLepaoSchool(url, data, options = {}) {
|
|
|
return doPost({ proxy: false })
|
|
return doPost({ proxy: false })
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- await logSchoolOutbound(logger, '(代理失败→直连)', url, { proxy: false })
|
|
|
|
|
|
|
+ await logSchoolOutbound(logger, '(代理失败→直连)', url, { proxy: false }, { mqTaskId })
|
|
|
await QgProxyManager.recordFallbackDirect({
|
|
await QgProxyManager.recordFallbackDirect({
|
|
|
reason: 'proxy_post_failed_then_direct',
|
|
reason: 'proxy_post_failed_then_direct',
|
|
|
path: briefUrlPath(url),
|
|
path: briefUrlPath(url),
|