Skip to content

Commit 3bd96db

Browse files
authored
fix: use Header().Add instead of Header() for setting Vary header (#99)
- Modify middleware to add "Vary: Origin" header before applying gzip compression - Add a new test to verify the "Vary" header is correctly set and gzip compression is applied - Update handler to use `Header().Add` instead of `Header()` for setting "Vary" header Signed-off-by: appleboy <[email protected]>
1 parent bc3ccd1 commit 3bd96db

File tree

3 files changed

+38
-5
lines changed

3 files changed

+38
-5
lines changed

_example/main.go

+8-4
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,14 @@ import (
1212

1313
func main() {
1414
r := gin.Default()
15-
r.Use(gzip.Gzip(
16-
gzip.DefaultCompression,
17-
gzip.WithExcludedPaths([]string{"/ping2"}),
18-
))
15+
r.Use(
16+
func(c *gin.Context) {
17+
c.Writer.Header().Add("Vary", "Origin")
18+
},
19+
gzip.Gzip(
20+
gzip.DefaultCompression,
21+
gzip.WithExcludedPaths([]string{"/ping2"}),
22+
))
1923
r.Use(func(c *gin.Context) {
2024
log.Println("Request received")
2125
c.Next()

gzip_test.go

+29
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,41 @@ func newServer() *gin.Engine {
5959
c.Header("Content-Length", strconv.Itoa(len(testResponse)))
6060
c.String(200, testResponse)
6161
})
62+
router.GET("/ping", func(c *gin.Context) {
63+
c.Writer.Header().Add("Vary", "Origin")
64+
}, func(c *gin.Context) {
65+
c.Header("Content-Length", strconv.Itoa(len(testResponse)))
66+
c.String(200, testResponse)
67+
})
6268
router.Any("/reverse", func(c *gin.Context) {
6369
rp.ServeHTTP(c.Writer, c.Request)
6470
})
6571
return router
6672
}
6773

74+
func TestVaryHeader(t *testing.T) {
75+
req, _ := http.NewRequestWithContext(context.Background(), "GET", "/ping", nil)
76+
req.Header.Add(headerAcceptEncoding, "gzip")
77+
78+
w := httptest.NewRecorder()
79+
r := newServer()
80+
r.ServeHTTP(w, req)
81+
82+
assert.Equal(t, 200, w.Code)
83+
assert.Equal(t, "gzip", w.Header().Get(headerContentEncoding))
84+
assert.Equal(t, []string{headerAcceptEncoding, "Origin"}, w.Header().Values(headerVary))
85+
assert.NotEqual(t, "0", w.Header().Get("Content-Length"))
86+
assert.NotEqual(t, 19, w.Body.Len())
87+
assert.Equal(t, w.Header().Get("Content-Length"), fmt.Sprint(w.Body.Len()))
88+
89+
gr, err := gzip.NewReader(w.Body)
90+
assert.NoError(t, err)
91+
defer gr.Close()
92+
93+
body, _ := io.ReadAll(gr)
94+
assert.Equal(t, testResponse, string(body))
95+
}
96+
6897
func TestGzip(t *testing.T) {
6998
req, _ := http.NewRequestWithContext(context.Background(), "GET", "/", nil)
7099
req.Header.Add(headerAcceptEncoding, "gzip")

handler.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ func (g *gzipHandler) Handle(c *gin.Context) {
8585
gz.Reset(c.Writer)
8686

8787
c.Header(headerContentEncoding, "gzip")
88-
c.Header(headerVary, headerAcceptEncoding)
88+
c.Writer.Header().Add(headerVary, headerAcceptEncoding)
8989
c.Writer = &gzipWriter{c.Writer, gz}
9090
defer func() {
9191
if c.Writer.Size() < 0 {

0 commit comments

Comments
 (0)