From f285d4b0d9018a5b256bcbb729c08bc87f09549e Mon Sep 17 00:00:00 2001 From: Mike Crute Date: Tue, 26 Sep 2023 21:02:27 -0700 Subject: echo: add header merge middleware --- echo/echo_default.go | 1 + echo/middleware/header_merger.go | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 echo/middleware/header_merger.go 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 { w.configureCompression(&c) w.Use(glmw.StrictSecure()) + w.Use(glmw.MergeHeaders()) w.configureCORS(&c) 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 @@ +package middleware + +import ( + "strings" + + "github.com/labstack/echo/v4" +) + +func mergeHeaders(c echo.Context) { + hdr := c.Response().Header() + + // echo duplicates the Vary header a few places so deduplicate them and + // write it out as a comma separated list instead of as many duplicate + // headers. + if vh := hdr.Values(echo.HeaderVary); len(vh) > 1 { + seen := map[string]bool{} + out := []string{} + for _, v := range vh { + if _, ok := seen[v]; !ok { + seen[v] = true + out = append(out, v) + } + } + hdr.Set(echo.HeaderVary, strings.Join(out, ", ")) + } +} + +// MergeHeaders merges together specific sets of duplicated headers. It +// doesn't try to be a general solution to header duplication because +// that would be too error prone. Currently this only works for the Vary +// header. +func MergeHeaders() echo.MiddlewareFunc { + return func(next echo.HandlerFunc) echo.HandlerFunc { + return func(c echo.Context) error { + c.Response().Before(func() { mergeHeaders(c) }) + return next(c) + } + } +} -- cgit v1.2.3