bugfix: OPTIONS 拦截器,在正式请求中缺少响应头 `'Access-Control-Allow-Credentials': 'true'` 的问题修复。

pull/408/head
王良 2024-11-28 17:54:54 +08:00
parent 13741d3b15
commit 51366cf2c8
4 changed files with 65 additions and 61 deletions

View File

@ -1,24 +1,28 @@
const responseReplaceApi = require('./responseReplace')
module.exports = {
name: 'OPTIONSHeaders',
name: 'AfterOPTIONSHeaders',
desc: '开启了options.js功能时正常请求时会需要增加响应头 `Access-Control-Allow-Origin: xxx`',
priority: 201,
responseIntercept (context, interceptOpt, req, res, proxyReq, proxyRes, ssl, next) {
const { rOptions, log } = context
if (rOptions.method === 'OPTIONS') {
if (rOptions.method === 'OPTIONS' || rOptions.headers.origin == null) {
return
}
const headers = {
'Access-Control-Allow-Credentials': 'true',
'Access-Control-Allow-Origin': rOptions.headers.origin,
}
res.setHeader('DS-AfterOPTIONSHeaders-Interceptor', '1')
// 替换响应头
if (responseReplaceApi.replaceResponseHeaders({ ...headers }, res, proxyRes)) {
res.setHeader('DS-AfterOPTIONSHeaders-Interceptor', rOptions.headers.origin)
log.info('AfterOPTIONSHeaders intercept:', JSON.stringify(headers))
} else {
res.setHeader('DS-AfterOPTIONSHeaders-Interceptor', '0')
}
},
is (interceptOpt) {

View File

@ -5,7 +5,10 @@ const REMOVE = '[remove]'
// 替换响应头
function replaceResponseHeaders (newHeaders, res, proxyRes) {
if (newHeaders && !lodash.isEmpty(newHeaders)) {
if (!newHeaders || lodash.isEmpty(newHeaders)) {
return null
}
// 响应头Key统一转小写
for (const headerKey in newHeaders) {
if (headerKey === headerKey.toLowerCase()) {
@ -58,9 +61,6 @@ function replaceResponseHeaders (newHeaders, res, proxyRes) {
}
// 返回原先响应头
return preHeaders
}
return null
}
module.exports = {

View File

@ -15,7 +15,7 @@ const unVerifySsl = require('./impl/req/unVerifySsl')
const baiduOcr = require('./impl/req/baiduOcr')
// response interceptor impls
const OPTIONSHeaders = require('./impl/res/AfterOPTIONSHeaders')
const AfterOPTIONSHeaders = require('./impl/res/AfterOPTIONSHeaders')
const cacheRes = require('./impl/res/cacheRes')
const responseReplace = require('./impl/res/responseReplace')
@ -30,6 +30,6 @@ module.exports = [
baiduOcr,
// response interceptor impls
OPTIONSHeaders, cacheRes, responseReplace,
AfterOPTIONSHeaders, cacheRes, responseReplace,
script,
]

View File

@ -13,8 +13,8 @@ const proxyRes = {
'Content-Length', '2',
'ETag', 'W/"2"',
'Date', 'Thu, 01 Jan 1970 00:00:00 GMT',
'Connection', 'keep-alive'
]
'Connection', 'keep-alive',
],
}
const newHeaders = {