Skip to content

Commit f07940b

Browse files
committed
add allowHeaders
1 parent 3155ce5 commit f07940b

File tree

2 files changed

+37
-5
lines changed

2 files changed

+37
-5
lines changed

server/cors.go

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@ import (
55
"strings"
66
)
77

8-
func allowCORS(h http.Handler, allowOrigins []string) http.Handler {
8+
var (
9+
defaultAllowHeaders = []string{"Content-Type", "Accept", "Authorization", "Origin"}
10+
)
11+
12+
func allowCORS(h http.Handler, allowOrigins []string, extraAllowHeaders []string) http.Handler {
913
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
1014
if origin := r.Header.Get("Origin"); origin != "" {
1115
if len(allowOrigins) > 0 {
@@ -20,16 +24,34 @@ func allowCORS(h http.Handler, allowOrigins []string) http.Handler {
2024
}
2125

2226
if r.Method == "OPTIONS" && r.Header.Get("Access-Control-Request-Method") != "" {
23-
preflightHandler(w, r)
27+
preflightHandler(w, r, extraAllowHeaders)
2428
return
2529
}
2630
}
2731
h.ServeHTTP(w, r)
2832
})
2933
}
3034

31-
func preflightHandler(w http.ResponseWriter, r *http.Request) {
32-
headers := []string{"Content-Type", "Accept", "Authorization", "Origin"}
35+
func evaluateExtraAllowHeaders(allowHeaders []string) []string {
36+
m := map[string]bool{}
37+
for _, h := range defaultAllowHeaders {
38+
m[h] = true
39+
}
40+
41+
extraAllowHeaders := []string{}
42+
for _, h := range allowHeaders {
43+
if m[h] == false {
44+
extraAllowHeaders = append(extraAllowHeaders, h)
45+
}
46+
}
47+
return extraAllowHeaders
48+
}
49+
50+
func preflightHandler(w http.ResponseWriter, r *http.Request, extraAllowHeaders []string) {
51+
headers := defaultAllowHeaders
52+
if len(extraAllowHeaders) > 0 {
53+
headers = append(headers, extraAllowHeaders...)
54+
}
3355
w.Header().Set("Access-Control-Allow-Headers", strings.Join(headers, ","))
3456
methods := []string{"GET", "HEAD", "POST", "PUT", "DELETE"}
3557
w.Header().Set("Access-Control-Allow-Methods", strings.Join(methods, ","))

server/server.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ type Server struct {
3232
initializeTimeout time.Duration
3333
registrars []func(mux *http.ServeMux) error
3434
allowOrigins []string
35+
allowHeaders []string
36+
extraAllowHeaders []string
3537

3638
// GRPCServer will be started whenever this is served
3739
GRPCServer *grpc.Server
@@ -66,7 +68,7 @@ func NewServer(opts ...Option) (*Server, error) {
6668
return nil, err
6769
}
6870
}
69-
s.HTTPServer.Handler = allowCORS(mux, s.allowOrigins)
71+
s.HTTPServer.Handler = allowCORS(mux, s.allowOrigins, s.extraAllowHeaders)
7072

7173
return s, nil
7274
}
@@ -137,6 +139,14 @@ func WithAllowOrigins(allowOrigins []string) Option {
137139
}
138140
}
139141

142+
func WithAllowHeaders(allowHeaders []string) Option {
143+
return func(s *Server) error {
144+
s.allowHeaders = allowHeaders
145+
s.extraAllowHeaders = evaluateExtraAllowHeaders(allowHeaders)
146+
return nil
147+
}
148+
}
149+
140150
// Serve invokes all initializers then serves on the given listeners.
141151
//
142152
// If a listener is left blank, then that particular part will not be served.

0 commit comments

Comments
 (0)