Fast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS
Mirrored from https://github.com/Slazee/caddy.git
Synced Nov 12, 03:15 UTC
reverseproxy: Via header (#6275)
Matthew Holt committed
Jan 17, 2025 at 06:49 UTC
e7da3b267bcec986aaca960dd22ef834d3b9d4a6
1 file changed
+18
-5
modules/caddyhttp/reverseproxy/reverseproxy.go
+18
-5
@@ -683,7 +683,7 @@ func (h Handler) prepareRequest(req *http.Request, repl *caddy.Replacer) (*http.
683
req.Header.Set("Early-Data", "1")
684
}
685
686
- reqUpType := upgradeType(req.Header)
686
+ reqUpgradeType := upgradeType(req.Header)
687
removeConnectionHeaders(req.Header)
688
689
// Remove hop-by-hop headers to the backend. Especially
@@ -704,9 +704,9 @@ func (h Handler) prepareRequest(req *http.Request, repl *caddy.Replacer) (*http.
704
705
// After stripping all the hop-by-hop connection headers above, add back any
706
// necessary for protocol upgrades, such as for websockets.
707
- if reqUpType != "" {
707
+ if reqUpgradeType != "" {
708
req.Header.Set("Connection", "Upgrade")
709
- req.Header.Set("Upgrade", reqUpType)
709
+ req.Header.Set("Upgrade", reqUpgradeType)
710
normalizeWebsocketHeaders(req.Header)
711
}
712
@@ -732,6 +732,9 @@ func (h Handler) prepareRequest(req *http.Request, repl *caddy.Replacer) (*http.
732
return nil, err
733
}
734
735
+ // Via header(s)
736
+ req.Header.Add("Via", fmt.Sprintf("%d.%d Caddy", req.ProtoMajor, req.ProtoMinor))
737
+
738
return req, nil
739
}
740
@@ -882,13 +885,15 @@ func (h *Handler) reverseProxy(rw http.ResponseWriter, req *http.Request, origRe
885
}),
886
)
887
888
+ const logMessage = "upstream roundtrip"
889
+
890
if err != nil {
886
- if c := logger.Check(zapcore.DebugLevel, "upstream roundtrip"); c != nil {
891
+ if c := logger.Check(zapcore.DebugLevel, logMessage); c != nil {
892
c.Write(zap.Error(err))
893
}
894
return err
895
}
891
- if c := logger.Check(zapcore.DebugLevel, "upstream roundtrip"); c != nil {
896
+ if c := logger.Check(zapcore.DebugLevel, logMessage); c != nil {
897
c.Write(
898
zap.Object("headers", caddyhttp.LoggableHTTPHeader{
899
Header: res.Header,
@@ -1024,6 +1029,14 @@ func (h *Handler) finalizeResponse(
1029
res.Header.Del(h)
1030
}
1031
1032
+ // delete our Server header and use Via instead (see #6275)
1033
+ rw.Header().Del("Server")
1034
+ var protoPrefix string
1035
+ if !strings.HasPrefix(strings.ToUpper(res.Proto), "HTTP/") {
1036
+ protoPrefix = res.Proto[:strings.Index(res.Proto, "/")+1]
1037
+ }
1038
+ rw.Header().Add("Via", fmt.Sprintf("%s%d.%d Caddy", protoPrefix, res.ProtoMajor, res.ProtoMinor))
1039
+
1040
// apply any response header operations
1041
if h.Headers != nil && h.Headers.Response != nil {
1042
if h.Headers.Response.Require == nil ||