Subject: [PATCH links] Adding DBI transaction rollback when a domain error occurs. This helps prevernt a hanging process due to transaction leak early in the request cycle.

From: Peter Sanchez <[email-masked]>
Date: Fri, 29 Aug 2025 08:24:42 -0600

Also gobwebs bump.
---
 domain/middleware.go | 17 +++++++++++++++++
 go.mod               | 12 ++++++------
 go.sum               | 12 ++++++++++++
 3 files changed, 35 insertions(+), 6 deletions(-)

diff --git a/domain/middleware.go b/domain/middleware.go
index efe2e84..e60e915 100644
--- a/domain/middleware.go
+++ b/domain/middleware.go
@@ -2,6 +2,7 @@ package domain
 
 import (
 	"context"
+	"database/sql"
 	"errors"
 	"fmt"
 	"links/models"
@@ -10,6 +11,7 @@ import (
 	"strings"
 
 	"github.com/labstack/echo/v4"
+	"netlandish.com/x/gobwebs/database"
 	"netlandish.com/x/gobwebs/server"
 )
 
@@ -62,6 +64,21 @@ func DomainContext(service string) echo.MiddlewareFunc {
 			req := c.Request()
 			domains, err := ValidDomain(req.Context(), req.Host, service, false)
 			if err != nil {
+				// Log the error for debugging
+				gctx := c.(*server.Context)
+				gctx.Echo().Logger.Printf(
+					"domain.DomainContext: Error validating domain %s: %v\n", req.Host, err)
+				
+				// Clean up any active transaction before returning error
+				// This prevents transaction leaks when domain validation fails
+				if dbi := database.DBIForContext(req.Context()); dbi != nil {
+					if dbi.HasActiveTransaction() {
+						if rbErr := dbi.RollbackTx(); rbErr != nil && rbErr != sql.ErrTxDone {
+							gctx.Echo().Logger.Printf(
+								"domain.DomainContext: Failed to rollback transaction after validation error: %v", rbErr)
+						}
+					}
+				}
 				return err
 			}
 			if len(domains) != 1 {
diff --git a/go.mod b/go.mod
index 92eaa23..f1f6fb8 100644
--- a/go.mod
+++ b/go.mod
@@ -30,12 +30,12 @@ require (
 	golang.org/x/text v0.27.0
 	golang.org/x/time v0.8.0
 	hg.code.netlandish.com/~netlandish/sendygo v0.0.0-20230124192435-bbf347776232
-	netlandish.com/x/gobwebs v0.1.6
-	netlandish.com/x/gobwebs-auditlog v0.2.3
-	netlandish.com/x/gobwebs-formguard v0.2.4
-	netlandish.com/x/gobwebs-graphql v0.2.4
-	netlandish.com/x/gobwebs-oauth2 v0.2.3
-	netlandish.com/x/gobwebs-ses-feedback v0.2.4
+	netlandish.com/x/gobwebs v0.1.7
+	netlandish.com/x/gobwebs-auditlog v0.2.4
+	netlandish.com/x/gobwebs-formguard v0.2.5
+	netlandish.com/x/gobwebs-graphql v0.2.5
+	netlandish.com/x/gobwebs-oauth2 v0.2.4
+	netlandish.com/x/gobwebs-ses-feedback v0.2.5
 	petersanchez.com/x/carrier v0.2.3
 	petersanchez.com/x/carrier/ses v0.0.0-20250114214955-7f5d9b835a85
 	petersanchez.com/x/carrier/smtp v0.0.0-20250114214955-7f5d9b835a85
diff --git a/go.sum b/go.sum
index ddd92c0..d16509f 100644
--- a/go.sum
+++ b/go.sum
@@ -2580,16 +2580,28 @@ modernc.org/z v1.2.20/go.mod h1:zU9FiF4PbHdOTUxw+IF8j7ArBMRPsHgq10uVPt6xTzo=
 modernc.org/zappy v1.0.0/go.mod h1:hHe+oGahLVII/aTTyWK/b53VDHMAGCBYYeZ9sn83HC4=
 netlandish.com/x/gobwebs v0.1.6 h1:/fXVU2hoS6FyIk/Refl1FqxCGJxjcCvCybnrxr2JYlI=
 netlandish.com/x/gobwebs v0.1.6/go.mod h1:RAf0VNiujzXen/pu0k6yyhvPWMgCY9tKD7ftXrkT53E=
+netlandish.com/x/gobwebs v0.1.7 h1:YPqieX9F8lQpjBRq9mrhG4ZKA6SoWMZ0Inz2xu5ZSOM=
+netlandish.com/x/gobwebs v0.1.7/go.mod h1:RAf0VNiujzXen/pu0k6yyhvPWMgCY9tKD7ftXrkT53E=
 netlandish.com/x/gobwebs-auditlog v0.2.3 h1:U9Kcbacy+6gUbm2wwXUKg4q7RpbRwHgaLXebQWiYlXk=
 netlandish.com/x/gobwebs-auditlog v0.2.3/go.mod h1:E5K6BDkD6BTgwGDz2GWOE/h/PfKuyswLDnhU1gDWNPQ=
+netlandish.com/x/gobwebs-auditlog v0.2.4 h1:IloSnIc8yGKeEwX5ylKx0I3VoLoa9Bezf98XUnLFIN0=
+netlandish.com/x/gobwebs-auditlog v0.2.4/go.mod h1:l1EJbQ79+vWc6l6yFnzRjE4NSRjGTAiwLPxUPQqzy/w=
 netlandish.com/x/gobwebs-formguard v0.2.4 h1:YkLudnPrwr9k/giURyohnjlfbuC+Ws8hnrrU+MY8vUc=
 netlandish.com/x/gobwebs-formguard v0.2.4/go.mod h1:0UZ/lWNAqHCwDYotp2WlX0XgfsF8PfV8XBr29kSJmP8=
+netlandish.com/x/gobwebs-formguard v0.2.5 h1:+Fa5T2qeP2ldv+sIXCVqsLFzp8NXQyI8ZvxVD5TsOA4=
+netlandish.com/x/gobwebs-formguard v0.2.5/go.mod h1:Qv+qymuUOCgKzhNmk31DOxT4PLu5bEwXFe2tMEBaljA=
 netlandish.com/x/gobwebs-graphql v0.2.4 h1:BWuWiTkTVJNdBITV36r42w7Uh+6HGgZvxOj3+XICsF4=
 netlandish.com/x/gobwebs-graphql v0.2.4/go.mod h1:vegE1Sb69L19qk/Urx7HWFhJ3FCjZZ5e0n5PlXDE1Qc=
+netlandish.com/x/gobwebs-graphql v0.2.5 h1:h1tr7PP+PbKABD+gP58ldi6GMPRLjAzp6sjXpcozEKg=
+netlandish.com/x/gobwebs-graphql v0.2.5/go.mod h1:nNGgCWC098JgaASCsvzZLl1rePzXgGcUtBEB+eJThhg=
 netlandish.com/x/gobwebs-oauth2 v0.2.3 h1:gtxVwa/TFquvPm7sL9CYPN6qF9dayovK09bhv8s/bkE=
 netlandish.com/x/gobwebs-oauth2 v0.2.3/go.mod h1:OXmkl1iL3MMy4CzdtAc9oOQbX/2kbR8/2t2GCahHBho=
+netlandish.com/x/gobwebs-oauth2 v0.2.4 h1:B5V5HNCeRU3TNXK0/59Vnc5Dn7nOA54snxXDnBjn+0g=
+netlandish.com/x/gobwebs-oauth2 v0.2.4/go.mod h1:LqCD8OZJkFr8rcDaNYeX8L6tsv/joAQ1k1iriCUlf+E=
 netlandish.com/x/gobwebs-ses-feedback v0.2.4 h1:0jSGszEAKxKOJrhiO/vQuuY6lQv7fcsP4s6Iw5EcOJk=
 netlandish.com/x/gobwebs-ses-feedback v0.2.4/go.mod h1:s7BCQ4lYPLdvzDuDvZmQn+7IHKsHNIkecs4jcjoZ0ZM=
+netlandish.com/x/gobwebs-ses-feedback v0.2.5 h1:o/9aP9CkijohA61834S2AFPk8mN07SkytLvoSAybOeY=
+netlandish.com/x/gobwebs-ses-feedback v0.2.5/go.mod h1:Nj7NSW936hRXq2QL1wa95C+g03GLhBIV5MN2K7zorGk=
 petersanchez.com/x/carrier v0.2.3 h1:6ScWG2HVFqeqafQp2D9kChNdXYkou4rduzppc3SDYMg=
 petersanchez.com/x/carrier v0.2.3/go.mod h1:GLiDI9OThDmruufk/VHlR6Ihvq/hIJQyA5beU6AFNYk=
 petersanchez.com/x/carrier/ses v0.0.0-20250114214955-7f5d9b835a85 h1:yy81/rrGdI+YWuTvv7JPvVnY104/g10vnloBnKxVAHk=
-- 
2.49.1

---

From: "Peter Sanchez" <[email-masked]>
Date: Fri, 29 Aug 2025 08:25:31 -0600

Applied.

To [email-masked]:~netlandish/links
   c877de1..001c767  master -> master