@@ -19,6 +19,13 @@ type (
19
19
// Optional. Default value []string{"*"}.
20
20
AllowOrigins []string `yaml:"allow_origins"`
21
21
22
+ // AllowOriginFunc is a custom function to validate the origin. It takes the
23
+ // origin as an argument and returns true if allowed or false otherwise. If
24
+ // an error is returned, it is returned by the handler. If this option is
25
+ // set, AllowOrigins is ignored.
26
+ // Optional.
27
+ AllowOriginFunc func (origin string ) (bool , error ) `yaml:"allow_origin_func"`
28
+
22
29
// AllowMethods defines a list methods allowed when accessing the resource.
23
30
// This is used in response to a preflight request.
24
31
// Optional. Default value DefaultCORSConfig.AllowMethods.
@@ -113,40 +120,50 @@ func CORSWithConfig(config CORSConfig) echo.MiddlewareFunc {
113
120
return c .NoContent (http .StatusNoContent )
114
121
}
115
122
116
- // Check allowed origins
117
- for _ , o := range config .AllowOrigins {
118
- if o == "*" && config .AllowCredentials {
119
- allowOrigin = origin
120
- break
121
- }
122
- if o == "*" || o == origin {
123
- allowOrigin = o
124
- break
125
- }
126
- if matchSubdomain (origin , o ) {
127
- allowOrigin = origin
128
- break
129
- }
130
- }
131
-
132
- // Check allowed origin patterns
133
- for _ , re := range allowOriginPatterns {
134
- if allowOrigin == "" {
135
- didx := strings .Index (origin , "://" )
136
- if didx == - 1 {
137
- continue
123
+ if config .AllowOriginFunc == nil {
124
+ // Check allowed origins
125
+ for _ , o := range config .AllowOrigins {
126
+ if o == "*" && config .AllowCredentials {
127
+ allowOrigin = origin
128
+ break
138
129
}
139
- domAuth := origin [didx + 3 :]
140
- // to avoid regex cost by invalid long domain
141
- if len (domAuth ) > 253 {
130
+ if o == "*" || o == origin {
131
+ allowOrigin = o
142
132
break
143
133
}
144
-
145
- if match , _ := regexp .MatchString (re , origin ); match {
134
+ if matchSubdomain (origin , o ) {
146
135
allowOrigin = origin
147
136
break
148
137
}
149
138
}
139
+
140
+ // Check allowed origin patterns
141
+ for _ , re := range allowOriginPatterns {
142
+ if allowOrigin == "" {
143
+ didx := strings .Index (origin , "://" )
144
+ if didx == - 1 {
145
+ continue
146
+ }
147
+ domAuth := origin [didx + 3 :]
148
+ // to avoid regex cost by invalid long domain
149
+ if len (domAuth ) > 253 {
150
+ break
151
+ }
152
+
153
+ if match , _ := regexp .MatchString (re , origin ); match {
154
+ allowOrigin = origin
155
+ break
156
+ }
157
+ }
158
+ }
159
+ } else {
160
+ allowed , err := config .AllowOriginFunc (origin )
161
+ if err != nil {
162
+ return err
163
+ }
164
+ if allowed {
165
+ allowOrigin = origin
166
+ }
150
167
}
151
168
152
169
// Origin not allowed
0 commit comments