mirror of
https://github.com/yusing/godoxy.git
synced 2026-04-24 01:08:31 +02: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
|
scheme := base.Scheme
|
||||||
retried := false
|
retried := false
|
||||||
retryLock := sync.Mutex{}
|
retryLock := sync.Mutex{}
|
||||||
rp.OnSchemeMisMatch = func() (retry bool) { // switch scheme and retry
|
if scheme == route.SchemeHTTP || scheme == route.SchemeHTTPS {
|
||||||
retryLock.Lock()
|
rp.OnSchemeMisMatch = func() (retry bool) { // switch scheme and retry
|
||||||
defer retryLock.Unlock()
|
retryLock.Lock()
|
||||||
|
defer retryLock.Unlock()
|
||||||
|
|
||||||
if retried {
|
if retried {
|
||||||
return false
|
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 {
|
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.ProxyURL = gperr.Collect(&errs, nettypes.ParseURL, "file://"+r.Root)
|
||||||
r.Host = ""
|
r.Host = ""
|
||||||
r.Port.Proxy = 0
|
r.Port.Proxy = 0
|
||||||
case route.SchemeHTTP, route.SchemeHTTPS:
|
case route.SchemeHTTP, route.SchemeHTTPS, route.SchemeH2C:
|
||||||
if r.Port.Listening != 0 {
|
if r.Port.Listening != 0 {
|
||||||
errs.Addf("unexpected listening port for %s scheme", r.Scheme)
|
errs.Addf("unexpected listening port for %s scheme", r.Scheme)
|
||||||
}
|
}
|
||||||
@@ -295,7 +295,7 @@ func (r *Route) validate() gperr.Error {
|
|||||||
switch r.Scheme {
|
switch r.Scheme {
|
||||||
case route.SchemeFileServer:
|
case route.SchemeFileServer:
|
||||||
impl, err = NewFileServer(r)
|
impl, err = NewFileServer(r)
|
||||||
case route.SchemeHTTP, route.SchemeHTTPS:
|
case route.SchemeHTTP, route.SchemeHTTPS, route.SchemeH2C:
|
||||||
impl, err = NewReverseProxyRoute(r)
|
impl, err = NewReverseProxyRoute(r)
|
||||||
case route.SchemeTCP, route.SchemeUDP:
|
case route.SchemeTCP, route.SchemeUDP:
|
||||||
impl, err = NewStreamRoute(r)
|
impl, err = NewStreamRoute(r)
|
||||||
|
|||||||
@@ -14,16 +14,18 @@ var ErrInvalidScheme = gperr.New("invalid scheme")
|
|||||||
const (
|
const (
|
||||||
SchemeHTTP Scheme = 1 << iota
|
SchemeHTTP Scheme = 1 << iota
|
||||||
SchemeHTTPS
|
SchemeHTTPS
|
||||||
|
SchemeH2C
|
||||||
SchemeTCP
|
SchemeTCP
|
||||||
SchemeUDP
|
SchemeUDP
|
||||||
SchemeFileServer
|
SchemeFileServer
|
||||||
SchemeNone Scheme = 0
|
SchemeNone Scheme = 0
|
||||||
|
|
||||||
schemeReverseProxy = SchemeHTTP | SchemeHTTPS
|
schemeReverseProxy = SchemeHTTP | SchemeHTTPS | SchemeH2C
|
||||||
schemeStream = SchemeTCP | SchemeUDP
|
schemeStream = SchemeTCP | SchemeUDP
|
||||||
|
|
||||||
schemeStrHTTP = "http"
|
schemeStrHTTP = "http"
|
||||||
schemeStrHTTPS = "https"
|
schemeStrHTTPS = "https"
|
||||||
|
schemeStrH2C = "h2c"
|
||||||
schemeStrTCP = "tcp"
|
schemeStrTCP = "tcp"
|
||||||
schemeStrUDP = "udp"
|
schemeStrUDP = "udp"
|
||||||
schemeStrFileServer = "fileserver"
|
schemeStrFileServer = "fileserver"
|
||||||
@@ -36,6 +38,8 @@ func (s Scheme) String() string {
|
|||||||
return schemeStrHTTP
|
return schemeStrHTTP
|
||||||
case SchemeHTTPS:
|
case SchemeHTTPS:
|
||||||
return schemeStrHTTPS
|
return schemeStrHTTPS
|
||||||
|
case SchemeH2C:
|
||||||
|
return schemeStrH2C
|
||||||
case SchemeTCP:
|
case SchemeTCP:
|
||||||
return schemeStrTCP
|
return schemeStrTCP
|
||||||
case SchemeUDP:
|
case SchemeUDP:
|
||||||
@@ -66,6 +70,8 @@ func (s *Scheme) Parse(v string) error {
|
|||||||
*s = SchemeHTTP
|
*s = SchemeHTTP
|
||||||
case schemeStrHTTPS:
|
case schemeStrHTTPS:
|
||||||
*s = SchemeHTTPS
|
*s = SchemeHTTPS
|
||||||
|
case schemeStrH2C:
|
||||||
|
*s = SchemeH2C
|
||||||
case schemeStrTCP:
|
case schemeStrTCP:
|
||||||
*s = SchemeTCP
|
*s = SchemeTCP
|
||||||
case schemeStrUDP:
|
case schemeStrUDP:
|
||||||
|
|||||||
Reference in New Issue
Block a user