diff --git a/goutils b/goutils index 51a75d68..d94d68f9 160000 --- a/goutils +++ b/goutils @@ -1 +1 @@ -Subproject commit 51a75d684b27fb705c996605d8ab8e219b5d47dd +Subproject commit d94d68f95d3e61bb0b16648e6ad80e7b3cc2afc1 diff --git a/internal/route/reverse_proxy.go b/internal/route/reverse_proxy.go index 50a803e2..caebc79d 100755 --- a/internal/route/reverse_proxy.go +++ b/internal/route/reverse_proxy.go @@ -64,23 +64,25 @@ func NewReverseProxyRoute(base *Route) (*ReveseProxyRoute, gperr.Error) { scheme := base.Scheme retried := false retryLock := sync.Mutex{} - rp.OnSchemeMisMatch = func() (retry bool) { // switch scheme and retry - retryLock.Lock() - defer retryLock.Unlock() + if scheme == route.SchemeHTTP || scheme == route.SchemeHTTPS { + rp.OnSchemeMisMatch = func() (retry bool) { // switch scheme and retry + retryLock.Lock() + defer retryLock.Unlock() - if retried { - return false + 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 } - - 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 { diff --git a/internal/route/route.go b/internal/route/route.go index 71d0dbb9..1602113f 100644 --- a/internal/route/route.go +++ b/internal/route/route.go @@ -272,7 +272,7 @@ func (r *Route) validate() gperr.Error { r.ProxyURL = gperr.Collect(&errs, nettypes.ParseURL, "file://"+r.Root) r.Host = "" r.Port.Proxy = 0 - case route.SchemeHTTP, route.SchemeHTTPS: + case route.SchemeHTTP, route.SchemeHTTPS, route.SchemeH2C: if r.Port.Listening != 0 { errs.Addf("unexpected listening port for %s scheme", r.Scheme) } @@ -295,7 +295,7 @@ func (r *Route) validate() gperr.Error { switch r.Scheme { case route.SchemeFileServer: impl, err = NewFileServer(r) - case route.SchemeHTTP, route.SchemeHTTPS: + case route.SchemeHTTP, route.SchemeHTTPS, route.SchemeH2C: impl, err = NewReverseProxyRoute(r) case route.SchemeTCP, route.SchemeUDP: impl, err = NewStreamRoute(r) diff --git a/internal/route/types/scheme.go b/internal/route/types/scheme.go index 9cb1dc80..b7044ab3 100644 --- a/internal/route/types/scheme.go +++ b/internal/route/types/scheme.go @@ -14,16 +14,18 @@ var ErrInvalidScheme = gperr.New("invalid scheme") const ( SchemeHTTP Scheme = 1 << iota SchemeHTTPS + SchemeH2C SchemeTCP SchemeUDP SchemeFileServer SchemeNone Scheme = 0 - schemeReverseProxy = SchemeHTTP | SchemeHTTPS + schemeReverseProxy = SchemeHTTP | SchemeHTTPS | SchemeH2C schemeStream = SchemeTCP | SchemeUDP schemeStrHTTP = "http" schemeStrHTTPS = "https" + schemeStrH2C = "h2c" schemeStrTCP = "tcp" schemeStrUDP = "udp" schemeStrFileServer = "fileserver" @@ -36,6 +38,8 @@ func (s Scheme) String() string { return schemeStrHTTP case SchemeHTTPS: return schemeStrHTTPS + case SchemeH2C: + return schemeStrH2C case SchemeTCP: return schemeStrTCP case SchemeUDP: @@ -66,6 +70,8 @@ func (s *Scheme) Parse(v string) error { *s = SchemeHTTP case schemeStrHTTPS: *s = SchemeHTTPS + case schemeStrH2C: + *s = SchemeH2C case schemeStrTCP: *s = SchemeTCP case schemeStrUDP: