From bcc6f031965e85fb6bd57043785b7b9b9b497172 Mon Sep 17 00:00:00 2001 From: tomholford Date: Wed, 22 Apr 2026 00:50:18 -0700 Subject: [PATCH] reverseproxy: add webtransport Caddyfile subdirective Adds a `webtransport` subdirective to the `transport http {}` block of reverse_proxy that sets the new WebTransport bool on the transport. Takes no arguments; exclusivity with versions 3 is enforced at Provision time so parse order doesn't matter. Example: reverse_proxy https://backend:9443 { transport http { versions 3 webtransport tls_insecure_skip_verify } } Includes a Caddyfile-to-JSON adapt test round-tripping the new subdirective. --- .../reverse_proxy_webtransport.caddyfiletest | 47 +++++++++++++++++++ modules/caddyhttp/reverseproxy/caddyfile.go | 9 ++++ 2 files changed, 56 insertions(+) create mode 100644 caddytest/integration/caddyfile_adapt/reverse_proxy_webtransport.caddyfiletest diff --git a/caddytest/integration/caddyfile_adapt/reverse_proxy_webtransport.caddyfiletest b/caddytest/integration/caddyfile_adapt/reverse_proxy_webtransport.caddyfiletest new file mode 100644 index 000000000..c55eb1945 --- /dev/null +++ b/caddytest/integration/caddyfile_adapt/reverse_proxy_webtransport.caddyfiletest @@ -0,0 +1,47 @@ +:8443 + +reverse_proxy https://backend:9443 { + transport http { + versions 3 + webtransport + tls_insecure_skip_verify + } +} +---------- +{ + "apps": { + "http": { + "servers": { + "srv0": { + "listen": [ + ":8443" + ], + "routes": [ + { + "handle": [ + { + "handler": "reverse_proxy", + "transport": { + "protocol": "http", + "tls": { + "insecure_skip_verify": true + }, + "versions": [ + "3" + ], + "webtransport": true + }, + "upstreams": [ + { + "dial": "backend:9443" + } + ] + } + ] + } + ] + } + } + } + } +} diff --git a/modules/caddyhttp/reverseproxy/caddyfile.go b/modules/caddyhttp/reverseproxy/caddyfile.go index 8716babe3..92ba48399 100644 --- a/modules/caddyhttp/reverseproxy/caddyfile.go +++ b/modules/caddyhttp/reverseproxy/caddyfile.go @@ -1315,6 +1315,15 @@ func (h *HTTPTransport) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { return d.ArgErr() } + case "webtransport": + // Accepts no arguments: `webtransport` alone enables it. + // Exclusivity with `versions 3` is enforced at Provision + // time so parsing is order-independent. + if d.NextArg() { + return d.Errf("webtransport does not take arguments") + } + h.WebTransport = true + case "compression": if d.NextArg() { if d.Val() == "off" {