41 lines
1.3 KiB
Diff
41 lines
1.3 KiB
Diff
# UNDF: UNDF-2026-000000558
|
|
--- a/pkg/middlewares/headers/header.go
|
|
+++ b/pkg/middlewares/headers/header.go
|
|
@@ -18,6 +18,7 @@ type Header struct {
|
|
next http.Handler
|
|
hasCustomHeaders bool
|
|
hasCorsHeaders bool
|
|
headers *dynamic.Headers
|
|
+ allowOriginSet map[string]struct{} // O(1) exact-origin lookup; built at init from AccessControlAllowOriginList
|
|
allowOriginRegexes []*regexp.Regexp
|
|
}
|
|
|
|
@@ -40,6 +41,12 @@ func NewHeader(next http.Handler, cfg dynamic.Headers) (*Header, error) {
|
|
+ originSet := make(map[string]struct{}, len(cfg.AccessControlAllowOriginList))
|
|
+ for _, o := range cfg.AccessControlAllowOriginList {
|
|
+ originSet[o] = struct{}{}
|
|
+ }
|
|
+
|
|
return &Header{
|
|
next: next,
|
|
headers: &cfg,
|
|
hasCustomHeaders: hasCustomHeaders,
|
|
hasCorsHeaders: hasCorsHeaders,
|
|
+ allowOriginSet: originSet,
|
|
allowOriginRegexes: regexes,
|
|
}, nil
|
|
}
|
|
|
|
@@ -178,10 +185,11 @@ func (s *Header) isOriginAllowed(origin string) (bool, string) {
|
|
- for _, item := range s.headers.AccessControlAllowOriginList {
|
|
- if item == "*" || item == origin {
|
|
- return true, item
|
|
- }
|
|
+ if _, ok := s.allowOriginSet["*"]; ok {
|
|
+ return true, "*"
|
|
+ }
|
|
+ if _, ok := s.allowOriginSet[origin]; ok { /* O(1) map lookup; was O(O) slice scan */
|
|
+ return true, origin
|
|
}
|
|
|
|
for _, regex := range s.allowOriginRegexes {
|