aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Crute <mike@crute.us>2023-09-26 21:02:27 -0700
committerMike Crute <mike@crute.us>2023-09-26 21:02:27 -0700
commitf285d4b0d9018a5b256bcbb729c08bc87f09549e (patch)
tree04e503c0533701d822562c1a94dd20a32ff2872c
parent209764b611eb5f12122ec6f3d6de109a20be25d0 (diff)
downloadgolib-f285d4b0d9018a5b256bcbb729c08bc87f09549e.tar.bz2
golib-f285d4b0d9018a5b256bcbb729c08bc87f09549e.tar.xz
golib-f285d4b0d9018a5b256bcbb729c08bc87f09549e.zip
echo: add header merge middlewareecho/v0.12.0
-rw-r--r--echo/echo_default.go1
-rw-r--r--echo/middleware/header_merger.go39
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 @@
1package middleware
2
3import (
4 "strings"
5
6 "github.com/labstack/echo/v4"
7)
8
9func 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.
32func 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}