diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 2aa8786..69437f4 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -24,8 +24,8 @@ jobs: matrix: platform: - linux/amd64 - - linux/arm/v6 - - linux/arm/v7 + # - linux/arm/v6 + # - linux/arm/v7 - linux/arm64 steps: - name: Prepare diff --git a/internal/config/query.go b/internal/config/query.go index d3195f5..7d70b6c 100644 --- a/internal/config/query.go +++ b/internal/config/query.go @@ -34,6 +34,7 @@ func (cfg *Config) RoutesByAlias() map[string]U.SerializedObject { } obj["provider"] = p.GetName() obj["type"] = string(r.Type()) + obj["started"] = r.Started() routes[alias] = obj }) return routes diff --git a/internal/models/raw_entry.go b/internal/models/raw_entry.go index 8647a98..8cfc0e9 100644 --- a/internal/models/raw_entry.go +++ b/internal/models/raw_entry.go @@ -5,6 +5,7 @@ import ( "strconv" "strings" + "github.com/sirupsen/logrus" . "github.com/yusing/go-proxy/internal/common" D "github.com/yusing/go-proxy/internal/docker" F "github.com/yusing/go-proxy/internal/utils/functional" @@ -72,11 +73,11 @@ func (e *RawEntry) FillMissingFields() bool { // try to fallback to first public port if p, ok := F.FirstValueOf(e.PublicPortMapping); ok { pp = fmt.Sprint(p.PublicPort) - } - // ignore only if it is NOT RUNNING - // because stopped containers - // will have empty port mapping got from docker - if e.Running { + } else if e.Running { + // ignore only if it is NOT RUNNING + // because stopped containers + // will have empty port mapping got from docker + logrus.Debugf("ignored port %s for %s", pp, e.ContainerName) return false } } diff --git a/internal/net/http/reverse_proxy_mod.go b/internal/net/http/reverse_proxy_mod.go index d3f5177..923011a 100644 --- a/internal/net/http/reverse_proxy_mod.go +++ b/internal/net/http/reverse_proxy_mod.go @@ -315,11 +315,6 @@ func (p *ReverseProxy) serveHTTP(rw http.ResponseWriter, req *http.Request) { outreq.Header.Set("Upgrade", reqUpType) } - outreq.Header.Del("Forwarded") - // outreq.Header.Del("X-Forwarded-For") - // outreq.Header.Del("X-Forwarded-Host") - // outreq.Header.Del("X-Forwarded-Proto") - if clientIP, _, err := net.SplitHostPort(req.RemoteAddr); err == nil { // If we aren't the first proxy retain prior // X-Forwarded-For information as a comma+space @@ -333,6 +328,14 @@ func (p *ReverseProxy) serveHTTP(rw http.ResponseWriter, req *http.Request) { outreq.Header.Set("X-Forwarded-For", clientIP) } } + if req.TLS == nil { + outreq.Header.Set("X-Forwarded-Proto", "http") + outreq.Header.Set("X-Forwarded-Scheme", "http") + } else { + outreq.Header.Set("X-Forwarded-Proto", "https") + outreq.Header.Set("X-Forwarded-Scheme", "https") + } + outreq.Header.Set("X-Forwarded-Host", req.Host) if _, ok := outreq.Header["User-Agent"]; !ok { // If the outbound request doesn't have a User-Agent header set, diff --git a/internal/proxy/entry.go b/internal/proxy/entry.go index 7b79ec0..4f7b024 100644 --- a/internal/proxy/entry.go +++ b/internal/proxy/entry.go @@ -43,6 +43,10 @@ func (rp *ReverseProxyEntry) UseIdleWatcher() bool { return rp.IdleTimeout > 0 && rp.DockerHost != "" } +func (rp *ReverseProxyEntry) IsDocker() bool { + return rp.DockerHost != "" +} + func ValidateEntry(m *M.RawEntry) (any, E.NestedError) { if !m.FillMissingFields() { return nil, E.Missing("fields") diff --git a/internal/route/http.go b/internal/route/http.go index 068810e..6e39c49 100755 --- a/internal/route/http.go +++ b/internal/route/http.go @@ -133,6 +133,10 @@ func (r *HTTPRoute) Start() E.NestedError { } } + if r.entry.IsDocker() && !r.entry.ContainerRunning { + return nil + } + r.mux = http.NewServeMux() for _, p := range r.PathPatterns { r.mux.HandleFunc(string(p), r.handler.ServeHTTP) @@ -160,6 +164,10 @@ func (r *HTTPRoute) Stop() E.NestedError { return nil } +func (r *HTTPRoute) Started() bool { + return r.mux != nil +} + func (u *URL) String() string { return (*url.URL)(u).String() } diff --git a/internal/route/route.go b/internal/route/route.go index 5aaf6a5..80cd40a 100755 --- a/internal/route/route.go +++ b/internal/route/route.go @@ -22,6 +22,7 @@ type ( RouteImpl interface { Start() E.NestedError Stop() E.NestedError + Started() bool String() string } RouteType string @@ -41,14 +42,14 @@ const ( var NewRoutes = F.NewMapOf[string, Route] func NewRoute(en *M.RawEntry) (Route, E.NestedError) { - rt, err := P.ValidateEntry(en) + entry, err := P.ValidateEntry(en) if err != nil { return nil, err } var t RouteType - - switch e := rt.(type) { + var rt RouteImpl + switch e := entry.(type) { case *P.StreamEntry: rt, err = NewStreamRoute(e) t = RouteTypeStream @@ -61,7 +62,7 @@ func NewRoute(en *M.RawEntry) (Route, E.NestedError) { if err != nil { return nil, err } - return &route{RouteImpl: rt.(RouteImpl), entry: en, type_: t}, nil + return &route{RouteImpl: rt, entry: en, type_: t}, nil } func (rt *route) Entry() *M.RawEntry { diff --git a/internal/route/stream.go b/internal/route/stream.go index af1446c..2931999 100755 --- a/internal/route/stream.go +++ b/internal/route/stream.go @@ -99,6 +99,10 @@ func (r *StreamRoute) Stop() E.NestedError { } } +func (r *StreamRoute) Started() bool { + return r.started.Load() +} + func (r *StreamRoute) grAcceptConnections() { defer r.wg.Done()