From b49d5652130584a313f3c0a72517ea6d0fff4f7d Mon Sep 17 00:00:00 2001 From: yusing Date: Thu, 18 Dec 2025 00:24:46 +0800 Subject: [PATCH] feat(reverse_proxy): add scheme mismatch handling for retry logic in reverse proxy --- goutils | 2 +- internal/route/reverse_proxy.go | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/goutils b/goutils index 6c698b1d..cb0f79b5 160000 --- a/goutils +++ b/goutils @@ -1 +1 @@ -Subproject commit 6c698b1d55d04591f362db585a6fbfe1a8893f56 +Subproject commit cb0f79b51ce2c38c55615ff7b2b1fba731ebfee5 diff --git a/internal/route/reverse_proxy.go b/internal/route/reverse_proxy.go index fba3bc4e..50a803e2 100755 --- a/internal/route/reverse_proxy.go +++ b/internal/route/reverse_proxy.go @@ -13,6 +13,7 @@ import ( "github.com/yusing/godoxy/internal/net/gphttp/middleware" nettypes "github.com/yusing/godoxy/internal/net/types" "github.com/yusing/godoxy/internal/route/routes" + route "github.com/yusing/godoxy/internal/route/types" "github.com/yusing/godoxy/internal/types" "github.com/yusing/godoxy/internal/watcher/health/monitor" gperr "github.com/yusing/goutils/errs" @@ -60,6 +61,28 @@ func NewReverseProxyRoute(base *Route) (*ReveseProxyRoute, gperr.Error) { service := base.Name() rp := reverseproxy.NewReverseProxy(service, &proxyURL.URL, trans) + scheme := base.Scheme + retried := false + retryLock := sync.Mutex{} + rp.OnSchemeMisMatch = func() (retry bool) { // switch scheme and retry + retryLock.Lock() + defer retryLock.Unlock() + + if retried { + return false + } + + retried = true + + if scheme == route.SchemeHTTP { + rp.TargetURL.Scheme = "https" + } else { + rp.TargetURL.Scheme = "http" + } + rp.Info().Msgf("scheme mismatch detected, retrying with %s", rp.TargetURL.Scheme) + return true + } + if len(base.Middlewares) > 0 { err := middleware.PatchReverseProxy(rp, base.Middlewares) if err != nil {