mirror of
https://github.com/yusing/godoxy.git
synced 2026-03-23 17:41:05 +01:00
feat(http/reverseproxy): h2c support with scheme: h2c
This commit is contained in:
2
goutils
2
goutils
Submodule goutils updated: 51a75d684b...d94d68f95d
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user