diff options
Diffstat (limited to 'echo')
-rw-r--r-- | echo/echo_default.go | 1 | ||||
-rw-r--r-- | echo/middleware/header_merger.go | 39 |
2 files changed, 40 insertions, 0 deletions
diff --git a/echo/echo_default.go b/echo/echo_default.go index 33ad015..067e52f 100644 --- a/echo/echo_default.go +++ b/echo/echo_default.go | |||
@@ -163,6 +163,7 @@ func (w *EchoWrapper) Configure(c EchoConfig) error { | |||
163 | w.configureCompression(&c) | 163 | w.configureCompression(&c) |
164 | 164 | ||
165 | w.Use(glmw.StrictSecure()) | 165 | w.Use(glmw.StrictSecure()) |
166 | w.Use(glmw.MergeHeaders()) | ||
166 | 167 | ||
167 | w.configureCORS(&c) | 168 | w.configureCORS(&c) |
168 | w.configureCSP(&c) | 169 | w.configureCSP(&c) |
diff --git a/echo/middleware/header_merger.go b/echo/middleware/header_merger.go new file mode 100644 index 0000000..706ca29 --- /dev/null +++ b/echo/middleware/header_merger.go | |||
@@ -0,0 +1,39 @@ | |||
1 | package middleware | ||
2 | |||
3 | import ( | ||
4 | "strings" | ||
5 | |||
6 | "github.com/labstack/echo/v4" | ||
7 | ) | ||
8 | |||
9 | func mergeHeaders(c echo.Context) { | ||
10 | hdr := c.Response().Header() | ||
11 | |||
12 | // echo duplicates the Vary header a few places so deduplicate them and | ||
13 | // write it out as a comma separated list instead of as many duplicate | ||
14 | // headers. | ||
15 | if vh := hdr.Values(echo.HeaderVary); len(vh) > 1 { | ||
16 | seen := map[string]bool{} | ||
17 | out := []string{} | ||
18 | for _, v := range vh { | ||
19 | if _, ok := seen[v]; !ok { | ||
20 | seen[v] = true | ||
21 | out = append(out, v) | ||
22 | } | ||
23 | } | ||
24 | hdr.Set(echo.HeaderVary, strings.Join(out, ", ")) | ||
25 | } | ||
26 | } | ||
27 | |||
28 | // MergeHeaders merges together specific sets of duplicated headers. It | ||
29 | // doesn't try to be a general solution to header duplication because | ||
30 | // that would be too error prone. Currently this only works for the Vary | ||
31 | // header. | ||
32 | func MergeHeaders() echo.MiddlewareFunc { | ||
33 | return func(next echo.HandlerFunc) echo.HandlerFunc { | ||
34 | return func(c echo.Context) error { | ||
35 | c.Response().Before(func() { mergeHeaders(c) }) | ||
36 | return next(c) | ||
37 | } | ||
38 | } | ||
39 | } | ||