aboutsummaryrefslogtreecommitdiffhomepage
path: root/modules/caddyhttp/reverseproxy
diff options
context:
space:
mode:
authorWeidiDeng <[email protected]>2024-10-11 17:02:23 +0800
committerGitHub <[email protected]>2024-10-11 09:02:23 +0000
commit48ce47f1d44da485fbbf6be536a0e3822763f313 (patch)
treef0c7871954be400a1a76f60fa1ca3bb357a3172c /modules/caddyhttp/reverseproxy
parentef4e0224a8495fc29847d865087febdee8736e3b (diff)
downloadcaddy-48ce47f1d44da485fbbf6be536a0e3822763f313.tar.gz
caddy-48ce47f1d44da485fbbf6be536a0e3822763f313.zip
reverseproxy: Use correct cases for websocket related headers (#6621)
Co-authored-by: Francis Lavoie <[email protected]>
Diffstat (limited to 'modules/caddyhttp/reverseproxy')
-rw-r--r--modules/caddyhttp/reverseproxy/reverseproxy.go25
-rw-r--r--modules/caddyhttp/reverseproxy/streaming.go1
2 files changed, 26 insertions, 0 deletions
diff --git a/modules/caddyhttp/reverseproxy/reverseproxy.go b/modules/caddyhttp/reverseproxy/reverseproxy.go
index bcbc1ff46..123bf774b 100644
--- a/modules/caddyhttp/reverseproxy/reverseproxy.go
+++ b/modules/caddyhttp/reverseproxy/reverseproxy.go
@@ -569,6 +569,30 @@ func (h *Handler) proxyLoopIteration(r *http.Request, origReq *http.Request, w h
return false, proxyErr
}
+// Mapping of the canonical form of the headers, to the RFC 6455 form,
+// i.e. `WebSocket` with uppercase 'S'.
+var websocketHeaderMapping = map[string]string{
+ "Sec-Websocket-Accept": "Sec-WebSocket-Accept",
+ "Sec-Websocket-Extensions": "Sec-WebSocket-Extensions",
+ "Sec-Websocket-Key": "Sec-WebSocket-Key",
+ "Sec-Websocket-Protocol": "Sec-WebSocket-Protocol",
+ "Sec-Websocket-Version": "Sec-WebSocket-Version",
+}
+
+// normalizeWebsocketHeaders ensures we use the standard casing as per
+// RFC 6455, i.e. `WebSocket` with uppercase 'S'. Most servers don't
+// care about this difference (read headers case insensitively), but
+// some do, so this maximizes compatibility with upstreams.
+// See https://github.com/caddyserver/caddy/pull/6621
+func normalizeWebsocketHeaders(header http.Header) {
+ for k, rk := range websocketHeaderMapping {
+ if v, ok := header[k]; ok {
+ delete(header, k)
+ header[rk] = v
+ }
+ }
+}
+
// prepareRequest clones req so that it can be safely modified without
// changing the original request or introducing data races. It then
// modifies it so that it is ready to be proxied, except for directing
@@ -655,6 +679,7 @@ func (h Handler) prepareRequest(req *http.Request, repl *caddy.Replacer) (*http.
if reqUpType != "" {
req.Header.Set("Connection", "Upgrade")
req.Header.Set("Upgrade", reqUpType)
+ normalizeWebsocketHeaders(req.Header)
}
// Set up the PROXY protocol info
diff --git a/modules/caddyhttp/reverseproxy/streaming.go b/modules/caddyhttp/reverseproxy/streaming.go
index c871a3fa1..3fde10b35 100644
--- a/modules/caddyhttp/reverseproxy/streaming.go
+++ b/modules/caddyhttp/reverseproxy/streaming.go
@@ -66,6 +66,7 @@ func (h *Handler) handleUpgradeResponse(logger *zap.Logger, wg *sync.WaitGroup,
// write header first, response headers should not be counted in size
// like the rest of handler chain.
copyHeader(rw.Header(), res.Header)
+ normalizeWebsocketHeaders(rw.Header())
rw.WriteHeader(res.StatusCode)
logger.Debug("upgrading connection")