From eda9a1b377effed349f2e818a3ce71c3c8df6173 Mon Sep 17 00:00:00 2001 From: Francis Lavoie Date: Mon, 2 Nov 2020 17:11:17 -0500 Subject: [PATCH] fastcgi: Add timeouts support to Caddyfile adapter (#3842) * fastcgi: Add timeouts support to Caddyfile adapter * fastcgi: Use tabs instead of spaces --- .../caddyfile_adapt/php_fastcgi_index_off.txt | 26 ++++--- .../reverseproxy/fastcgi/caddyfile.go | 72 +++++++++++++++++++ 2 files changed, 88 insertions(+), 10 deletions(-) diff --git a/caddytest/integration/caddyfile_adapt/php_fastcgi_index_off.txt b/caddytest/integration/caddyfile_adapt/php_fastcgi_index_off.txt index 6d939b4d..5ebdbd2e 100644 --- a/caddytest/integration/caddyfile_adapt/php_fastcgi_index_off.txt +++ b/caddytest/integration/caddyfile_adapt/php_fastcgi_index_off.txt @@ -1,15 +1,18 @@ :8884 php_fastcgi localhost:9000 { - # some php_fastcgi-specific subdirectives - split .php .php5 - env VAR1 value1 - env VAR2 value2 - root /var/www - index off + # some php_fastcgi-specific subdirectives + split .php .php5 + env VAR1 value1 + env VAR2 value2 + root /var/www + index off + dial_timeout 3s + read_timeout 10s + write_timeout 20s - # passed through to reverse_proxy (directive order doesn't matter!) - lb_policy random + # passed through to reverse_proxy (directive order doesn't matter!) + lb_policy random } ---------- { @@ -39,16 +42,19 @@ php_fastcgi localhost:9000 { } }, "transport": { + "dial_timeout": 3000000000, "env": { "VAR1": "value1", "VAR2": "value2" }, "protocol": "fastcgi", + "read_timeout": 10000000000, "root": "/var/www", "split_path": [ ".php", ".php5" - ] + ], + "write_timeout": 20000000000 }, "upstreams": [ { @@ -63,4 +69,4 @@ php_fastcgi localhost:9000 { } } } -} \ No newline at end of file +} diff --git a/modules/caddyhttp/reverseproxy/fastcgi/caddyfile.go b/modules/caddyhttp/reverseproxy/fastcgi/caddyfile.go index 8228439f..4d0b23b2 100644 --- a/modules/caddyhttp/reverseproxy/fastcgi/caddyfile.go +++ b/modules/caddyhttp/reverseproxy/fastcgi/caddyfile.go @@ -40,6 +40,9 @@ func init() { // split // env // resolve_root_symlink +// dial_timeout +// read_timeout +// write_timeout // } // func (t *Transport) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { @@ -69,8 +72,41 @@ func (t *Transport) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { t.EnvVars[args[0]] = args[1] case "resolve_root_symlink": + if d.NextArg() { + return d.ArgErr() + } t.ResolveRootSymlink = true + case "dial_timeout": + if !d.NextArg() { + return d.ArgErr() + } + dur, err := caddy.ParseDuration(d.Val()) + if err != nil { + return d.Errf("bad timeout value %s: %v", d.Val(), err) + } + t.DialTimeout = caddy.Duration(dur) + + case "read_timeout": + if !d.NextArg() { + return d.ArgErr() + } + dur, err := caddy.ParseDuration(d.Val()) + if err != nil { + return d.Errf("bad timeout value %s: %v", d.Val(), err) + } + t.ReadTimeout = caddy.Duration(dur) + + case "write_timeout": + if !d.NextArg() { + return d.ArgErr() + } + dur, err := caddy.ParseDuration(d.Val()) + if err != nil { + return d.Errf("bad timeout value %s: %v", d.Val(), err) + } + t.WriteTimeout = caddy.Duration(dur) + default: return d.Errf("unrecognized subdirective %s", d.Val()) } @@ -208,6 +244,42 @@ func parsePHPFastCGI(h httpcaddyfile.Helper) ([]httpcaddyfile.ConfigValue, error dispenser.Delete() } fcgiTransport.ResolveRootSymlink = true + + case "dial_timeout": + if !dispenser.NextArg() { + return nil, dispenser.ArgErr() + } + dur, err := caddy.ParseDuration(dispenser.Val()) + if err != nil { + return nil, dispenser.Errf("bad timeout value %s: %v", dispenser.Val(), err) + } + fcgiTransport.DialTimeout = caddy.Duration(dur) + dispenser.Delete() + dispenser.Delete() + + case "read_timeout": + if !dispenser.NextArg() { + return nil, dispenser.ArgErr() + } + dur, err := caddy.ParseDuration(dispenser.Val()) + if err != nil { + return nil, dispenser.Errf("bad timeout value %s: %v", dispenser.Val(), err) + } + fcgiTransport.ReadTimeout = caddy.Duration(dur) + dispenser.Delete() + dispenser.Delete() + + case "write_timeout": + if !dispenser.NextArg() { + return nil, dispenser.ArgErr() + } + dur, err := caddy.ParseDuration(dispenser.Val()) + if err != nil { + return nil, dispenser.Errf("bad timeout value %s: %v", dispenser.Val(), err) + } + fcgiTransport.WriteTimeout = caddy.Duration(dur) + dispenser.Delete() + dispenser.Delete() } } }