diff --git a/internal/route/fileserver.go b/internal/route/fileserver.go index 2b2870a5..737c43ae 100644 --- a/internal/route/fileserver.go +++ b/internal/route/fileserver.go @@ -97,10 +97,6 @@ func (s *FileServer) Start(parent task.Parent) gperr.Error { return nil } - if err := checkExists(s); err != nil { - return err - } - routes.HTTP.Add(s) s.task.OnFinished("remove_route_from_http", func() { routes.HTTP.Del(s) diff --git a/internal/route/reverse_proxy.go b/internal/route/reverse_proxy.go index 0239cde2..55478d57 100755 --- a/internal/route/reverse_proxy.go +++ b/internal/route/reverse_proxy.go @@ -136,10 +136,6 @@ func (r *ReveseProxyRoute) Start(parent task.Parent) gperr.Error { return nil } - if err := checkExists(r); err != nil { - return err - } - if r.UseLoadBalance() { r.addToLoadBalancer(parent) } else { @@ -171,7 +167,7 @@ func (r *ReveseProxyRoute) addToLoadBalancer(parent task.Parent) { linked = l.(*ReveseProxyRoute) lb = linked.loadBalancer lb.UpdateConfigIfNeeded(cfg) - if linked.Homepage == nil { + if linked.Homepage.Name == "" { linked.Homepage = r.Homepage } } else { @@ -187,10 +183,8 @@ func (r *ReveseProxyRoute) addToLoadBalancer(parent task.Parent) { handler: lb, } routes.HTTP.AddKey(cfg.Link, linked) - routes.All.AddKey(cfg.Link, linked) r.task.OnFinished("remove_loadbalancer_route", func() { routes.HTTP.DelKey(cfg.Link) - routes.All.DelKey(cfg.Link) }) lbLock.Unlock() } diff --git a/internal/route/route.go b/internal/route/route.go index 31a52a63..b37dae62 100644 --- a/internal/route/route.go +++ b/internal/route/route.go @@ -24,7 +24,6 @@ import ( "github.com/yusing/go-proxy/internal/common" config "github.com/yusing/go-proxy/internal/config/types" "github.com/yusing/go-proxy/internal/logging/accesslog" - "github.com/yusing/go-proxy/internal/route/routes" "github.com/yusing/go-proxy/internal/route/rules" route "github.com/yusing/go-proxy/internal/route/types" "github.com/yusing/go-proxy/internal/utils" @@ -46,7 +45,7 @@ type ( HealthCheck *types.HealthCheckConfig `json:"healthcheck"` LoadBalance *types.LoadBalancerConfig `json:"load_balance,omitempty" extensions:"x-nullable"` Middlewares map[string]types.LabelMap `json:"middlewares,omitempty" extensions:"x-nullable"` - Homepage *homepage.ItemConfig `json:"homepage"` + Homepage homepage.ItemConfig `json:"homepage"` AccessLog *accesslog.RequestLoggerConfig `json:"access_log,omitempty" extensions:"x-nullable"` Agent string `json:"agent,omitempty"` @@ -287,25 +286,27 @@ func (r *Route) start(parent task.Parent) gperr.Error { } defer close(r.started) - if err := r.impl.Start(parent); err != nil { - return err + // skip checking for excluded routes + if !r.ShouldExclude() { + if err := checkExists(r); err != nil { + return err + } } - if conflict, added := routes.All.AddIfNotExists(r.impl); !added { - err := gperr.Errorf("route %s already exists: from %s and %s", r.Alias, r.ProviderName(), conflict.ProviderName()) - r.task.FinishAndWait(err) + if cont := r.ContainerInfo(); cont != nil { + docker.SetDockerHostByContainerID(cont.ContainerID, cont.DockerHost) + } + + if err := r.impl.Start(parent); err != nil { return err - } else { - // reference here because r.impl will be nil after Finish() is called. - impl := r.impl - r.task.OnCancel("remove_routes_from_all", func() { - routes.All.Del(impl) - }) } return nil } func (r *Route) Finish(reason any) { + if cont := r.ContainerInfo(); cont != nil { + docker.DeleteDockerHostByContainerID(cont.ContainerID) + } r.FinishAndWait(reason) } @@ -410,16 +411,16 @@ func (r *Route) LoadBalanceConfig() *types.LoadBalancerConfig { return r.LoadBalance } -func (r *Route) HomepageConfig() *homepage.ItemConfig { - return r.Homepage.GetOverride(r.Alias) -} - -func (r *Route) HomepageItem() *homepage.Item { - return &homepage.Item{ +func (r *Route) HomepageItem() homepage.Item { + return homepage.Item{ Alias: r.Alias, Provider: r.Provider, - ItemConfig: r.HomepageConfig(), - } + ItemConfig: r.Homepage, + }.GetOverride() +} + +func (r *Route) DisplayName() string { + return r.Homepage.Name } func (r *Route) ContainerInfo() *types.Container { @@ -629,10 +630,8 @@ func (r *Route) FinalizeHomepageConfig() { isDocker := r.Container != nil - if r.Homepage == nil { - r.Homepage = &homepage.ItemConfig{Show: true} - } - r.Homepage = r.Homepage.GetOverride(r.Alias) + // apply override config + r.Homepage = r.HomepageItem().ItemConfig if r.ShouldExclude() && isDocker { r.Homepage.Show = false diff --git a/internal/route/routes/routes.go b/internal/route/routes/routes.go index 6377b267..1f6c515a 100644 --- a/internal/route/routes/routes.go +++ b/internal/route/routes/routes.go @@ -8,16 +8,15 @@ import ( var ( HTTP = pool.New[types.HTTPRoute]("http_routes") Stream = pool.New[types.StreamRoute]("stream_routes") - // All is a pool of all routes, including HTTP, Stream routes and also excluded routes. - All = pool.New[types.Route]("all_routes") ) -func init() { - All.DisableLog() -} - func Iter(yield func(r types.Route) bool) { - for _, r := range All.Iter { + for _, r := range HTTP.Iter { + if !yield(r) { + break + } + } + for _, r := range Stream.Iter { if !yield(r) { break } @@ -25,7 +24,12 @@ func Iter(yield func(r types.Route) bool) { } func IterKV(yield func(alias string, r types.Route) bool) { - for k, r := range All.Iter { + for k, r := range HTTP.Iter { + if !yield(k, r) { + break + } + } + for k, r := range Stream.Iter { if !yield(k, r) { break } @@ -33,13 +37,12 @@ func IterKV(yield func(alias string, r types.Route) bool) { } func NumRoutes() int { - return All.Size() + return HTTP.Size() + Stream.Size() } func Clear() { HTTP.Clear() Stream.Clear() - All.Clear() } func GetHTTPRouteOrExact(alias, host string) (types.HTTPRoute, bool) { @@ -52,5 +55,11 @@ func GetHTTPRouteOrExact(alias, host string) (types.HTTPRoute, bool) { } func Get(alias string) (types.Route, bool) { - return All.Get(alias) + if r, ok := HTTP.Get(alias); ok { + return r, true + } + if r, ok := Stream.Get(alias); ok { + return r, true + } + return nil, false } diff --git a/internal/route/stream.go b/internal/route/stream.go index 0c4adcd8..d42d1ac8 100755 --- a/internal/route/stream.go +++ b/internal/route/stream.go @@ -73,10 +73,6 @@ func (r *StreamRoute) Start(parent task.Parent) gperr.Error { return nil } - if err := checkExists(r); err != nil { - return err - } - r.ListenAndServe(r.task.Context(), nil, nil) r.l = r.l.With().Stringer("rurl", r.ProxyURL).Stringer("laddr", r.LocalAddr()).Logger() r.l.Info().Msg("stream started")