diff --git a/cmd/api-router.go b/cmd/api-router.go index 517b0dd6d..3bd9eb7d2 100644 --- a/cmd/api-router.go +++ b/cmd/api-router.go @@ -523,14 +523,9 @@ func corsHandler(handler http.Handler) http.Handler { "x-amz*", "*", } - - return cors.New(cors.Options{ + opts := cors.Options{ AllowOriginFunc: func(origin string) bool { - allowedOrigins := globalAPIConfig.getCorsAllowOrigins() - if len(allowedOrigins) == 0 { - allowedOrigins = []string{"*"} - } - for _, allowedOrigin := range allowedOrigins { + for _, allowedOrigin := range globalAPIConfig.getCorsAllowOrigins() { if wildcard.MatchSimple(allowedOrigin, origin) { return true } @@ -549,5 +544,13 @@ func corsHandler(handler http.Handler) http.Handler { AllowedHeaders: commonS3Headers, ExposedHeaders: commonS3Headers, AllowCredentials: true, - }).Handler(handler) + } + for _, origin := range globalAPIConfig.getCorsAllowOrigins() { + if origin == "*" { + opts.AllowOriginFunc = nil + opts.AllowedOrigins = globalAPIConfig.getCorsAllowOrigins() + break + } + } + return cors.New(opts).Handler(handler) } diff --git a/cmd/server_test.go b/cmd/server_test.go index 8463593bc..f81c82a7d 100644 --- a/cmd/server_test.go +++ b/cmd/server_test.go @@ -219,7 +219,7 @@ func (s *TestSuiteCommon) TestBucketSQSNotificationWebHook(c *check) { func (s *TestSuiteCommon) TestCors(c *check) { expectedMap := http.Header{} expectedMap.Set("Access-Control-Allow-Credentials", "true") - expectedMap.Set("Access-Control-Allow-Origin", "http://foobar.com") + expectedMap.Set("Access-Control-Allow-Origin", "*") expectedMap["Access-Control-Expose-Headers"] = []string{ "Date", "Etag", diff --git a/internal/config/api/api.go b/internal/config/api/api.go index 7428a40d8..6cef0abfb 100644 --- a/internal/config/api/api.go +++ b/internal/config/api/api.go @@ -193,9 +193,17 @@ func LookupConfig(kvs config.KVS) (cfg Config, err error) { RootAccess: rootAccess, } - corsAllowOrigin := strings.Split(env.Get(EnvAPICorsAllowOrigin, kvs.Get(apiCorsAllowOrigin)), ",") - if len(corsAllowOrigin) == 0 { + var corsAllowOrigin []string + corsList := env.Get(EnvAPICorsAllowOrigin, kvs.Get(apiCorsAllowOrigin)) + if corsList == "" { corsAllowOrigin = []string{"*"} // defaults to '*' + } else { + corsAllowOrigin = strings.Split(corsList, ",") + for _, cors := range corsAllowOrigin { + if cors == "" { + return cfg, errors.New("invalid cors value") + } + } } cfg.CorsAllowOrigin = corsAllowOrigin