From 30e254fd016a2bcb65933dc7bae0380b9ec068ea Mon Sep 17 00:00:00 2001
From: Garet Halliday <me@garet.holiday>
Date: Tue, 17 Oct 2023 18:28:12 -0500
Subject: [PATCH] hybrid routing settings

---
 lib/gat/gatcaddyfile/pool.go | 75 +++++++++++++++++++++++++++++++++++-
 1 file changed, 74 insertions(+), 1 deletion(-)

diff --git a/lib/gat/gatcaddyfile/pool.go b/lib/gat/gatcaddyfile/pool.go
index a895d4c4..78938db4 100644
--- a/lib/gat/gatcaddyfile/pool.go
+++ b/lib/gat/gatcaddyfile/pool.go
@@ -47,6 +47,7 @@ func init() {
 			if !d.NextBlock(d.Nesting()) {
 				return nil, d.ArgErr()
 			}
+			module.TrackedParameters = nil
 
 			for {
 				if d.Val() == "}" {
@@ -158,6 +159,78 @@ func init() {
 		return &module, nil
 	})
 	RegisterDirective(Pool, "hybrid", func(d *caddyfile.Dispenser, warnings *[]caddyconfig.Warning) (caddy.Module, error) {
-		return &hybrid.Factory{}, nil
+		module := hybrid.Factory{
+			Config: hybrid.Config{
+				ServerIdleTimeout:          caddy.Duration(5 * time.Minute),
+				ServerReconnectInitialTime: caddy.Duration(5 * time.Second),
+				ServerReconnectMaxTime:     caddy.Duration(1 * time.Minute),
+				TrackedParameters: []strutil.CIString{
+					strutil.MakeCIString("client_encoding"),
+					strutil.MakeCIString("datestyle"),
+					strutil.MakeCIString("timezone"),
+					strutil.MakeCIString("standard_conforming_strings"),
+					strutil.MakeCIString("application_name"),
+				},
+			},
+		}
+
+		if d.NextBlock(d.Nesting()) {
+			module.TrackedParameters = nil
+
+			for {
+				if d.Val() == "}" {
+					break
+				}
+
+				directive := d.Val()
+				switch directive {
+				case "idle_timeout":
+					if !d.NextArg() {
+						return nil, d.ArgErr()
+					}
+
+					val, err := time.ParseDuration(d.Val())
+					if err != nil {
+						return nil, d.WrapErr(err)
+					}
+
+					module.ServerIdleTimeout = caddy.Duration(val)
+				case "reconnect":
+					if !d.NextArg() {
+						return nil, d.ArgErr()
+					}
+
+					initialTime, err := time.ParseDuration(d.Val())
+					if err != nil {
+						return nil, d.WrapErr(err)
+					}
+
+					maxTime := initialTime
+					if d.NextArg() {
+						maxTime, err = time.ParseDuration(d.Val())
+						if err != nil {
+							return nil, d.WrapErr(err)
+						}
+					}
+
+					module.ServerReconnectInitialTime = caddy.Duration(initialTime)
+					module.ServerReconnectMaxTime = caddy.Duration(maxTime)
+				case "track":
+					if !d.NextArg() {
+						return nil, d.ArgErr()
+					}
+
+					module.TrackedParameters = append(module.TrackedParameters, strutil.MakeCIString(d.Val()))
+				default:
+					return nil, d.ArgErr()
+				}
+
+				if !d.NextLine() {
+					return nil, d.EOFErr()
+				}
+			}
+		}
+
+		return &module, nil
 	})
 }
-- 
GitLab