Skip to content

Commit e19471c

Browse files
authored
Prevent empty Access-Control-Expose-Headers header (#160)
Fixes #159
1 parent 20a76bd commit e19471c

File tree

2 files changed

+56
-1
lines changed

2 files changed

+56
-1
lines changed

cors.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,9 @@ func New(options Options) *Cors {
215215
}
216216

217217
// Pre-compute exposed headers header value
218-
c.exposedHeaders = []string{strings.Join(convert(options.ExposedHeaders, http.CanonicalHeaderKey), ", ")}
218+
if len(options.ExposedHeaders) > 0 {
219+
c.exposedHeaders = []string{strings.Join(convert(options.ExposedHeaders, http.CanonicalHeaderKey), ", ")}
220+
}
219221

220222
// Pre-compute prefight Vary header to save allocations
221223
if c.allowPrivateNetwork {

cors_test.go

+53
Original file line numberDiff line numberDiff line change
@@ -752,3 +752,56 @@ func TestCorsAreHeadersAllowed(t *testing.T) {
752752
})
753753
}
754754
}
755+
756+
func TestAccessControlExposeHeadersPresence(t *testing.T) {
757+
cases := []struct {
758+
name string
759+
options Options
760+
want bool
761+
}{
762+
{
763+
name: "omit",
764+
options: Options{},
765+
want: false,
766+
},
767+
{
768+
name: "include",
769+
options: Options{
770+
ExposedHeaders: []string{"X-Something"},
771+
},
772+
want: true,
773+
},
774+
}
775+
776+
for _, tt := range cases {
777+
t.Run(tt.name, func(t *testing.T) {
778+
s := New(tt.options)
779+
780+
req, _ := http.NewRequest("GET", "http://example.com/foo", nil)
781+
req.Header.Add("Origin", "http://foobar.com")
782+
783+
assertExposeHeaders := func(t *testing.T, resHeaders http.Header) {
784+
if _, have := resHeaders["Access-Control-Expose-Headers"]; have != tt.want {
785+
t.Errorf("Access-Control-Expose-Headers have: %t want: %t", have, tt.want)
786+
}
787+
}
788+
789+
t.Run("Handler", func(t *testing.T) {
790+
res := httptest.NewRecorder()
791+
s.Handler(testHandler).ServeHTTP(res, req)
792+
assertExposeHeaders(t, res.Header())
793+
})
794+
t.Run("HandlerFunc", func(t *testing.T) {
795+
res := httptest.NewRecorder()
796+
s.HandlerFunc(res, req)
797+
assertExposeHeaders(t, res.Header())
798+
})
799+
t.Run("Negroni", func(t *testing.T) {
800+
res := httptest.NewRecorder()
801+
s.ServeHTTP(res, req, testHandler)
802+
assertExposeHeaders(t, res.Header())
803+
})
804+
})
805+
}
806+
807+
}

0 commit comments

Comments
 (0)