aboutsummaryrefslogtreecommitdiff
path: root/plugin/timeouts/timeouts.go
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/timeouts/timeouts.go')
-rw-r--r--plugin/timeouts/timeouts.go69
1 files changed, 69 insertions, 0 deletions
diff --git a/plugin/timeouts/timeouts.go b/plugin/timeouts/timeouts.go
new file mode 100644
index 000000000..eea6a6488
--- /dev/null
+++ b/plugin/timeouts/timeouts.go
@@ -0,0 +1,69 @@
+package timeouts
+
+import (
+ "time"
+
+ "github.com/coredns/caddy"
+ "github.com/coredns/coredns/core/dnsserver"
+ "github.com/coredns/coredns/plugin"
+ "github.com/coredns/coredns/plugin/pkg/durations"
+)
+
+func init() { plugin.Register("timeouts", setup) }
+
+func setup(c *caddy.Controller) error {
+ err := parseTimeouts(c)
+ if err != nil {
+ return plugin.Error("timeouts", err)
+ }
+ return nil
+}
+
+func parseTimeouts(c *caddy.Controller) error {
+ config := dnsserver.GetConfig(c)
+
+ for c.Next() {
+ args := c.RemainingArgs()
+ if len(args) > 0 {
+ return plugin.Error("timeouts", c.ArgErr())
+ }
+
+ b := 0
+ for c.NextBlock() {
+ block := c.Val()
+ timeoutArgs := c.RemainingArgs()
+ if len(timeoutArgs) != 1 {
+ return c.ArgErr()
+ }
+
+ timeout, err := durations.NewDurationFromArg(timeoutArgs[0])
+ if err != nil {
+ return c.Err(err.Error())
+ }
+
+ if timeout < (1*time.Second) || timeout > (24*time.Hour) {
+ return c.Errf("timeout provided '%s' needs to be between 1 second and 24 hours", timeout)
+ }
+
+ switch block {
+ case "read":
+ config.ReadTimeout = timeout
+
+ case "write":
+ config.WriteTimeout = timeout
+
+ case "idle":
+ config.IdleTimeout = timeout
+
+ default:
+ return c.Errf("unknown option: '%s'", block)
+ }
+ b++
+ }
+
+ if b == 0 {
+ return plugin.Error("timeouts", c.Err("timeouts block with no timeouts specified"))
+ }
+ }
+ return nil
+}