mirror of
https://github.com/langgenius/dify.git
synced 2026-05-06 18:27:19 +08:00
Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: jyong <718720800@qq.com> Co-authored-by: Yansong Zhang <916125788@qq.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: hj24 <mambahj24@gmail.com> Co-authored-by: hj24 <huangjian@dify.ai> Co-authored-by: Joel <iamjoel007@gmail.com> Co-authored-by: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Co-authored-by: CodingOnStar <hanxujiang@dify.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: 非法操作 <hjlarry@163.com> Co-authored-by: Ayush Baluni <73417844+aayushbaluni@users.noreply.github.com> Co-authored-by: yyh <92089059+lyzno1@users.noreply.github.com> Co-authored-by: jimcody1995 <jjimcody@gmail.com> Co-authored-by: James <63717587+jamesrayammons@users.noreply.github.com> Co-authored-by: Yunlu Wen <yunlu.wen@dify.ai> Co-authored-by: Stephen Zhou <hi@hyoban.cc> Co-authored-by: Coding On Star <447357187@qq.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: jerryzai <jerryzh8710@protonmail.com> Co-authored-by: NVIDIAN <speedy.hpc@hotmail.com> Co-authored-by: ai-hpc <ai-hpc@users.noreply.github.com> Co-authored-by: Asuka Minato <i@asukaminato.eu.org> Co-authored-by: Junghwan <70629228+shaun0927@users.noreply.github.com> Co-authored-by: HeYinKazune <70251095+HeYin-OS@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: yyh <yuanyouhuilyz@gmail.com> Co-authored-by: Jingyi <jingyi.qi@dify.ai> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: sxxtony <166789813+sxxtony@users.noreply.github.com>
99 lines
3.0 KiB
TypeScript
99 lines
3.0 KiB
TypeScript
const DEFAULT_PROXY_TARGET = 'https://cloud.dify.ai'
|
|
|
|
const SECURE_COOKIE_PREFIX_PATTERN = /^__(Host|Secure)-/
|
|
const SAME_SITE_NONE_PATTERN = /^samesite=none$/i
|
|
const COOKIE_PATH_PATTERN = /^path=/i
|
|
const COOKIE_DOMAIN_PATTERN = /^domain=/i
|
|
const COOKIE_SECURE_PATTERN = /^secure$/i
|
|
const COOKIE_PARTITIONED_PATTERN = /^partitioned$/i
|
|
|
|
const HOST_PREFIX_COOKIE_NAMES = new Set([
|
|
'access_token',
|
|
'csrf_token',
|
|
'refresh_token',
|
|
'webapp_access_token',
|
|
])
|
|
|
|
const isPassportCookie = (cookieName: string) => cookieName.startsWith('passport-')
|
|
|
|
const shouldUseHostPrefix = (cookieName: string) => {
|
|
const normalizedCookieName = cookieName.replace(SECURE_COOKIE_PREFIX_PATTERN, '')
|
|
return HOST_PREFIX_COOKIE_NAMES.has(normalizedCookieName) || isPassportCookie(normalizedCookieName)
|
|
}
|
|
|
|
const toUpstreamCookieName = (cookieName: string) => {
|
|
if (cookieName.startsWith('__Host-'))
|
|
return cookieName
|
|
|
|
if (cookieName.startsWith('__Secure-'))
|
|
return `__Host-${cookieName.replace(SECURE_COOKIE_PREFIX_PATTERN, '')}`
|
|
|
|
if (!shouldUseHostPrefix(cookieName))
|
|
return cookieName
|
|
|
|
return `__Host-${cookieName}`
|
|
}
|
|
|
|
const toLocalCookieName = (cookieName: string) => cookieName.replace(SECURE_COOKIE_PREFIX_PATTERN, '')
|
|
|
|
export const rewriteCookieHeaderForUpstream = (cookieHeader?: string) => {
|
|
if (!cookieHeader)
|
|
return cookieHeader
|
|
|
|
return cookieHeader
|
|
.split(/;\s*/)
|
|
.filter(Boolean)
|
|
.map((cookie) => {
|
|
const separatorIndex = cookie.indexOf('=')
|
|
if (separatorIndex === -1)
|
|
return cookie
|
|
|
|
const cookieName = cookie.slice(0, separatorIndex).trim()
|
|
const cookieValue = cookie.slice(separatorIndex + 1)
|
|
return `${toUpstreamCookieName(cookieName)}=${cookieValue}`
|
|
})
|
|
.join('; ')
|
|
}
|
|
|
|
const rewriteSetCookieValueForLocal = (setCookieValue: string) => {
|
|
const [rawCookiePair, ...rawAttributes] = setCookieValue.split(';')
|
|
const separatorIndex = rawCookiePair!.indexOf('=')
|
|
|
|
if (separatorIndex === -1)
|
|
return setCookieValue
|
|
|
|
const cookieName = rawCookiePair!.slice(0, separatorIndex).trim()
|
|
const cookieValue = rawCookiePair!.slice(separatorIndex + 1)
|
|
const rewrittenAttributes = rawAttributes
|
|
.map(attribute => attribute.trim())
|
|
.filter(attribute =>
|
|
!COOKIE_DOMAIN_PATTERN.test(attribute)
|
|
&& !COOKIE_SECURE_PATTERN.test(attribute)
|
|
&& !COOKIE_PARTITIONED_PATTERN.test(attribute),
|
|
)
|
|
.map((attribute) => {
|
|
if (SAME_SITE_NONE_PATTERN.test(attribute))
|
|
return 'SameSite=Lax'
|
|
|
|
if (COOKIE_PATH_PATTERN.test(attribute))
|
|
return 'Path=/'
|
|
|
|
return attribute
|
|
})
|
|
|
|
return [`${toLocalCookieName(cookieName)}=${cookieValue}`, ...rewrittenAttributes].join('; ')
|
|
}
|
|
|
|
export const rewriteSetCookieHeadersForLocal = (setCookieHeaders?: string | string[]): string[] | undefined => {
|
|
if (!setCookieHeaders)
|
|
return undefined
|
|
|
|
const normalizedHeaders = Array.isArray(setCookieHeaders)
|
|
? setCookieHeaders
|
|
: [setCookieHeaders]
|
|
|
|
return normalizedHeaders.map(rewriteSetCookieValueForLocal)
|
|
}
|
|
|
|
export { DEFAULT_PROXY_TARGET }
|