Skip to content

Commit

Permalink
fixed container routes not being loaded, added X-Forwarded-{Scheme,Pr…
Browse files Browse the repository at this point in the history
…oto,Host}, fixed containers with no mapping being served
  • Loading branch information
yusing committed Sep 30, 2024
1 parent 48dd139 commit 478311f
Show file tree
Hide file tree
Showing 8 changed files with 38 additions and 16 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/docker-image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions internal/config/query.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
11 changes: 6 additions & 5 deletions internal/models/raw_entry.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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
}
}
Expand Down
13 changes: 8 additions & 5 deletions internal/net/http/reverse_proxy_mod.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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,
Expand Down
4 changes: 4 additions & 0 deletions internal/proxy/entry.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
8 changes: 8 additions & 0 deletions internal/route/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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()
}
Expand Down
9 changes: 5 additions & 4 deletions internal/route/route.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ type (
RouteImpl interface {
Start() E.NestedError
Stop() E.NestedError
Started() bool
String() string
}
RouteType string
Expand All @@ -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
Expand All @@ -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 {
Expand Down
4 changes: 4 additions & 0 deletions internal/route/stream.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand Down

0 comments on commit 478311f

Please sign in to comment.