Skip to content

Commit 217dd36

Browse files
committed
improved CORS
* added Vary header * ACA headers are sent regardless of ACR headers * ACA-Headers returns all allowed headers not just matching ones
1 parent 21f8dd1 commit 217dd36

2 files changed

Lines changed: 20 additions & 37 deletions

File tree

data/defaults.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,4 +63,10 @@ settings:
6363
cors:
6464
methods: [GET, POST, PUT, PATCH, DELETE, OPTIONS]
6565
headers:
66-
["Content-Type", "Authorization", "Accept", "Accept-Language", "Origin"]
66+
[
67+
"Content-Type",
68+
"Content-Language",
69+
"Authorization",
70+
"Accept",
71+
"Accept-Language",
72+
]

internals/proxy/middlewares/cors.go

Lines changed: 13 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package middlewares
33
import (
44
"net/http"
55
"net/url"
6-
"slices"
76
"strings"
87

98
"github.com/codeshelldev/secured-signal-api/internals/config"
@@ -47,48 +46,26 @@ func corsHandler(next http.Handler) http.Handler {
4746

4847
w.Header().Set("Access-Control-Allow-Origin", origin)
4948

49+
// add Origin header to Vary (if needed)
50+
if w.Header().Get("Vary") != "*" {
51+
w.Header().Add("Vary", "Origin")
52+
}
53+
5054
// CORS preflight request
5155
if req.Method == "OPTIONS" {
52-
requestedMethod := req.Header.Get("Access-Control-Request-Method")
56+
allowedMethods := matchingOrigin.Methods.ValueOrFallback(defaultMethods)
5357

54-
if requestedMethod != "" {
55-
allowedMethods := matchingOrigin.Methods.ValueOrFallback(defaultMethods)
56-
57-
if len(allowedMethods) != 0 {
58-
// only set if any (matching) methods
59-
w.Header().Set("Access-Control-Allow-Methods", strings.Join(allowedMethods, ","))
60-
}
58+
if len(allowedMethods) != 0 {
59+
// only set if any methods
60+
w.Header().Set("Access-Control-Allow-Methods", strings.Join(allowedMethods, ","))
6161
}
6262

63-
requestedHeaders := req.Header.Get("Access-Control-Request-Headers")
64-
65-
if requestedHeaders != "" {
66-
allowedHeaders := matchingOrigin.Headers.ValueOrFallback(defaultHeaders)
67-
68-
matchingHeaders := []string{}
69-
70-
// echo back allowed and requested headers
71-
for header := range strings.SplitSeq(requestedHeaders, ",") {
72-
header = strings.TrimSpace(header)
73-
74-
var match string
75-
76-
if slices.ContainsFunc(allowedHeaders, func(allowed string) bool {
77-
if strings.EqualFold(header, allowed) {
78-
match = allowed
79-
return true
80-
}
8163

82-
return false
83-
}) {
84-
matchingHeaders = append(matchingHeaders, match)
85-
}
86-
}
64+
allowedHeaders := matchingOrigin.Headers.ValueOrFallback(defaultHeaders)
8765

88-
if len(matchingHeaders) != 0 {
89-
// only set if any (matching) headers
90-
w.Header().Set("Access-Control-Allow-Headers", strings.Join(matchingHeaders, ","))
91-
}
66+
if len(allowedHeaders) != 0 {
67+
// only set if any headers
68+
w.Header().Set("Access-Control-Allow-Headers", strings.Join(allowedHeaders, ","))
9269
}
9370

9471
w.WriteHeader(http.StatusNoContent)

0 commit comments

Comments
 (0)