From 18cd1c0525a00363a91e9cecd38572607c52cedb Mon Sep 17 00:00:00 2001 From: Mohammed Al Sahaf Date: Sat, 24 Aug 2024 15:54:19 +0300 Subject: [PATCH] add caddyfile implementation Signed-off-by: Mohammed Al Sahaf --- ...everse_proxy_http_transport_none_proxy.txt | 40 +++++++++++++ ...reverse_proxy_http_transport_url_proxy.txt | 41 +++++++++++++ modules/caddyhttp/reverseproxy/caddyfile.go | 16 +++++ modules/caddytls/proxy.go | 3 + .../network/networkproxy.go} | 60 ++++++++++++------- 5 files changed, 138 insertions(+), 22 deletions(-) create mode 100644 caddytest/integration/caddyfile_adapt/reverse_proxy_http_transport_none_proxy.txt create mode 100644 caddytest/integration/caddyfile_adapt/reverse_proxy_http_transport_url_proxy.txt create mode 100644 modules/caddytls/proxy.go rename modules/{standard/proxy.go => internal/network/networkproxy.go} (75%) diff --git a/caddytest/integration/caddyfile_adapt/reverse_proxy_http_transport_none_proxy.txt b/caddytest/integration/caddyfile_adapt/reverse_proxy_http_transport_none_proxy.txt new file mode 100644 index 000000000..6d41ed5b9 --- /dev/null +++ b/caddytest/integration/caddyfile_adapt/reverse_proxy_http_transport_none_proxy.txt @@ -0,0 +1,40 @@ +:8884 +reverse_proxy 127.0.0.1:65535 { + transport http { + forward_proxy none + } +} +---------- +{ + "apps": { + "http": { + "servers": { + "srv0": { + "listen": [ + ":8884" + ], + "routes": [ + { + "handle": [ + { + "handler": "reverse_proxy", + "transport": { + "network_proxy": { + "from": "none" + }, + "protocol": "http" + }, + "upstreams": [ + { + "dial": "127.0.0.1:65535" + } + ] + } + ] + } + ] + } + } + } + } +} diff --git a/caddytest/integration/caddyfile_adapt/reverse_proxy_http_transport_url_proxy.txt b/caddytest/integration/caddyfile_adapt/reverse_proxy_http_transport_url_proxy.txt new file mode 100644 index 000000000..c4134eec1 --- /dev/null +++ b/caddytest/integration/caddyfile_adapt/reverse_proxy_http_transport_url_proxy.txt @@ -0,0 +1,41 @@ +:8884 +reverse_proxy 127.0.0.1:65535 { + transport http { + forward_proxy url http://localhost:8080 + } +} +---------- +{ + "apps": { + "http": { + "servers": { + "srv0": { + "listen": [ + ":8884" + ], + "routes": [ + { + "handle": [ + { + "handler": "reverse_proxy", + "transport": { + "network_proxy": { + "from": "url", + "url": "http://localhost:8080" + }, + "protocol": "http" + }, + "upstreams": [ + { + "dial": "127.0.0.1:65535" + } + ] + } + ] + } + ] + } + } + } + } +} diff --git a/modules/caddyhttp/reverseproxy/caddyfile.go b/modules/caddyhttp/reverseproxy/caddyfile.go index 12e2b9b97..9fe6a1ebe 100644 --- a/modules/caddyhttp/reverseproxy/caddyfile.go +++ b/modules/caddyhttp/reverseproxy/caddyfile.go @@ -1074,6 +1074,22 @@ func (h *HTTPTransport) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { } h.ForwardProxyURL = d.Val() + case "forward_proxy": + if !d.NextArg() { + return d.ArgErr() + } + modStem := d.Val() + modID := "caddy.network_proxy.source." + modStem + unm, err := caddyfile.UnmarshalModule(d, modID) + if err != nil { + return err + } + // TODO: should we validate here? + // ca, ok := unm.(caddy.ProxyFuncProducer) + // if !ok { + // return d.Errf("module %s is not a caddy.ProxyFuncProducer", modID) + // } + h.NetworkProxyRaw = caddyconfig.JSONModuleObject(unm, "from", modStem, nil) case "dial_timeout": if !d.NextArg() { return d.ArgErr() diff --git a/modules/caddytls/proxy.go b/modules/caddytls/proxy.go new file mode 100644 index 000000000..7a5e9c5c7 --- /dev/null +++ b/modules/caddytls/proxy.go @@ -0,0 +1,3 @@ +package caddytls + +import _ "github.com/caddyserver/caddy/v2/modules/internal/network" diff --git a/modules/standard/proxy.go b/modules/internal/network/networkproxy.go similarity index 75% rename from modules/standard/proxy.go rename to modules/internal/network/networkproxy.go index d3ada40ea..f75168e81 100644 --- a/modules/standard/proxy.go +++ b/modules/internal/network/networkproxy.go @@ -1,4 +1,4 @@ -package standard +package network import ( "errors" @@ -9,28 +9,12 @@ import ( "go.uber.org/zap" "github.com/caddyserver/caddy/v2" + "github.com/caddyserver/caddy/v2/caddyconfig/caddyfile" ) func init() { - caddy.RegisterModule(ProxyFromEnvironment{}) caddy.RegisterModule(ProxyFromURL{}) -} - -type ProxyFromEnvironment struct{} - -// ProxyFunc implements ProxyFuncProducer. -func (p ProxyFromEnvironment) ProxyFunc() func(*http.Request) (*url.URL, error) { - return http.ProxyFromEnvironment -} - -// CaddyModule implements Module. -func (p ProxyFromEnvironment) CaddyModule() caddy.ModuleInfo { - return caddy.ModuleInfo{ - ID: "caddy.network_proxy.source.environment", - New: func() caddy.Module { - return ProxyFromEnvironment{} - }, - } + caddy.RegisterModule(ProxyFromNone{}) } type ProxyFromURL struct { @@ -111,16 +95,48 @@ func (p ProxyFromURL) ProxyFunc() func(*http.Request) (*url.URL, error) { return pUrl, err } } - return func(*http.Request) (*url.URL, error) { + return func(r *http.Request) (*url.URL, error) { return url.Parse(p.URL) } } +// UnmarshalCaddyfile implements caddyfile.Unmarshaler. +func (p *ProxyFromURL) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { + d.Next() + d.Next() + p.URL = d.Val() + return nil +} + +type ProxyFromNone struct{} + +func (p ProxyFromNone) CaddyModule() caddy.ModuleInfo { + return caddy.ModuleInfo{ + ID: "caddy.network_proxy.source.none", + New: func() caddy.Module { + return &ProxyFromNone{} + }, + } +} + +// UnmarshalCaddyfile implements caddyfile.Unmarshaler. +func (p ProxyFromNone) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { + return nil +} + +// ProxyFunc implements ProxyFuncProducer. +func (p ProxyFromNone) ProxyFunc() func(*http.Request) (*url.URL, error) { + return nil +} + var ( - _ caddy.Module = ProxyFromEnvironment{} - _ caddy.ProxyFuncProducer = ProxyFromEnvironment{} _ caddy.Module = ProxyFromURL{} _ caddy.Provisioner = &ProxyFromURL{} _ caddy.Validator = ProxyFromURL{} _ caddy.ProxyFuncProducer = ProxyFromURL{} + _ caddyfile.Unmarshaler = &ProxyFromURL{} + + _ caddy.Module = ProxyFromNone{} + _ caddy.ProxyFuncProducer = ProxyFromNone{} + _ caddyfile.Unmarshaler = ProxyFromNone{} )