synced ported cors middleware

This commit is contained in:
Gani Georgiev 2024-11-22 23:18:50 +02:00
parent e5f1bc3c37
commit 2e43518bb4
1 changed files with 15 additions and 3 deletions

View File

@ -134,13 +134,25 @@ func CORS(config CORSConfig) *hook.Handler[*core.RequestEvent] {
config.AllowMethods = DefaultCORSConfig.AllowMethods config.AllowMethods = DefaultCORSConfig.AllowMethods
} }
allowOriginPatterns := []string{} allowOriginPatterns := make([]*regexp.Regexp, 0, len(config.AllowOrigins))
for _, origin := range config.AllowOrigins { for _, origin := range config.AllowOrigins {
if origin == "*" {
continue // "*" is handled differently and does not need regexp
}
pattern := regexp.QuoteMeta(origin) pattern := regexp.QuoteMeta(origin)
pattern = strings.ReplaceAll(pattern, "\\*", ".*") pattern = strings.ReplaceAll(pattern, "\\*", ".*")
pattern = strings.ReplaceAll(pattern, "\\?", ".") pattern = strings.ReplaceAll(pattern, "\\?", ".")
pattern = "^" + pattern + "$" pattern = "^" + pattern + "$"
allowOriginPatterns = append(allowOriginPatterns, pattern)
re, err := regexp.Compile(pattern)
if err != nil {
// This is to preserve previous behaviour - invalid patterns were just ignored.
// If we would turn this to panic, users with invalid patterns
// would have applications crashing in production due unrecovered panic.
continue
}
allowOriginPatterns = append(allowOriginPatterns, re)
} }
allowMethods := strings.Join(config.AllowMethods, ",") allowMethods := strings.Join(config.AllowMethods, ",")
@ -210,7 +222,7 @@ func CORS(config CORSConfig) *hook.Handler[*core.RequestEvent] {
} }
if checkPatterns { if checkPatterns {
for _, re := range allowOriginPatterns { for _, re := range allowOriginPatterns {
if match, _ := regexp.MatchString(re, origin); match { if match := re.MatchString(origin); match {
allowOrigin = origin allowOrigin = origin
break break
} }