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 {