0
Fork 0
mirror of https://github.com/caddyserver/caddy.git synced 2025-01-20 22:52:58 -05:00

reverseproxy: Via header (#6275)

This commit is contained in:
Matthew Holt 2025-01-17 06:49:01 -07:00
parent 9e0e5a4b4c
commit e7da3b267b
No known key found for this signature in database
GPG key ID: 2A349DD577D586A5

View file

@ -683,7 +683,7 @@ func (h Handler) prepareRequest(req *http.Request, repl *caddy.Replacer) (*http.
req.Header.Set("Early-Data", "1") req.Header.Set("Early-Data", "1")
} }
reqUpType := upgradeType(req.Header) reqUpgradeType := upgradeType(req.Header)
removeConnectionHeaders(req.Header) removeConnectionHeaders(req.Header)
// Remove hop-by-hop headers to the backend. Especially // Remove hop-by-hop headers to the backend. Especially
@ -704,9 +704,9 @@ func (h Handler) prepareRequest(req *http.Request, repl *caddy.Replacer) (*http.
// After stripping all the hop-by-hop connection headers above, add back any // After stripping all the hop-by-hop connection headers above, add back any
// necessary for protocol upgrades, such as for websockets. // necessary for protocol upgrades, such as for websockets.
if reqUpType != "" { if reqUpgradeType != "" {
req.Header.Set("Connection", "Upgrade") req.Header.Set("Connection", "Upgrade")
req.Header.Set("Upgrade", reqUpType) req.Header.Set("Upgrade", reqUpgradeType)
normalizeWebsocketHeaders(req.Header) normalizeWebsocketHeaders(req.Header)
} }
@ -732,6 +732,9 @@ func (h Handler) prepareRequest(req *http.Request, repl *caddy.Replacer) (*http.
return nil, err return nil, err
} }
// Via header(s)
req.Header.Add("Via", fmt.Sprintf("%d.%d Caddy", req.ProtoMajor, req.ProtoMinor))
return req, nil return req, nil
} }
@ -882,13 +885,15 @@ func (h *Handler) reverseProxy(rw http.ResponseWriter, req *http.Request, origRe
}), }),
) )
const logMessage = "upstream roundtrip"
if err != nil { if err != nil {
if c := logger.Check(zapcore.DebugLevel, "upstream roundtrip"); c != nil { if c := logger.Check(zapcore.DebugLevel, logMessage); c != nil {
c.Write(zap.Error(err)) c.Write(zap.Error(err))
} }
return err return err
} }
if c := logger.Check(zapcore.DebugLevel, "upstream roundtrip"); c != nil { if c := logger.Check(zapcore.DebugLevel, logMessage); c != nil {
c.Write( c.Write(
zap.Object("headers", caddyhttp.LoggableHTTPHeader{ zap.Object("headers", caddyhttp.LoggableHTTPHeader{
Header: res.Header, Header: res.Header,
@ -1024,6 +1029,14 @@ func (h *Handler) finalizeResponse(
res.Header.Del(h) res.Header.Del(h)
} }
// delete our Server header and use Via instead (see #6275)
rw.Header().Del("Server")
var protoPrefix string
if !strings.HasPrefix(strings.ToUpper(res.Proto), "HTTP/") {
protoPrefix = res.Proto[:strings.Index(res.Proto, "/")+1]
}
rw.Header().Add("Via", fmt.Sprintf("%s%d.%d Caddy", protoPrefix, res.ProtoMajor, res.ProtoMinor))
// apply any response header operations // apply any response header operations
if h.Headers != nil && h.Headers.Response != nil { if h.Headers != nil && h.Headers.Response != nil {
if h.Headers.Response.Require == nil || if h.Headers.Response.Require == nil ||