diff --git a/internal/net/http/middleware/real_ip.go b/internal/net/http/middleware/real_ip.go index 884ad00..75bfb82 100644 --- a/internal/net/http/middleware/real_ip.go +++ b/internal/net/http/middleware/real_ip.go @@ -2,7 +2,6 @@ package middleware import ( "net" - "net/http" D "github.com/yusing/go-proxy/internal/docker" E "github.com/yusing/go-proxy/internal/error" @@ -52,11 +51,8 @@ var realIPOptsDefault = func() *realIPOpts { func NewRealIP(opts OptionsRaw) (*Middleware, E.NestedError) { riWithOpts := new(realIP) riWithOpts.m = &Middleware{ - impl: riWithOpts, - before: func(next http.HandlerFunc, w ResponseWriter, r *Request) { - riWithOpts.setRealIP(r) - next(w, r) - }, + impl: riWithOpts, + before: Rewrite(riWithOpts.setRealIP), } riWithOpts.realIPOpts = realIPOptsDefault() err := Deserialize(opts, riWithOpts.realIPOpts) diff --git a/internal/net/http/middleware/x_forwarded.go b/internal/net/http/middleware/x_forwarded.go index 0712687..1770d3e 100644 --- a/internal/net/http/middleware/x_forwarded.go +++ b/internal/net/http/middleware/x_forwarded.go @@ -2,7 +2,6 @@ package middleware import ( "net" - "net/http" ) const ( @@ -15,7 +14,7 @@ const ( ) var SetXForwarded = &Middleware{ - before: func(next http.HandlerFunc, w ResponseWriter, req *Request) { + before: Rewrite(func(req *Request) { req.Header.Del("Forwarded") req.Header.Del(xForwardedFor) req.Header.Del(xForwardedHost) @@ -32,16 +31,14 @@ var SetXForwarded = &Middleware{ } else { req.Header.Set(xForwardedProto, "https") } - next(w, req) - }, + }), } var HideXForwarded = &Middleware{ - before: func(next http.HandlerFunc, w ResponseWriter, req *Request) { + before: Rewrite(func(req *Request) { req.Header.Del("Forwarded") req.Header.Del(xForwardedFor) req.Header.Del(xForwardedHost) req.Header.Del(xForwardedProto) - next(w, req) - }, + }), } diff --git a/internal/proxy/provider/docker.go b/internal/proxy/provider/docker.go index d6a8950..2a06c63 100755 --- a/internal/proxy/provider/docker.go +++ b/internal/proxy/provider/docker.go @@ -87,7 +87,7 @@ func (p *DockerProvider) shouldIgnore(container D.Container) bool { func (p *DockerProvider) OnEvent(event W.Event, routes R.Routes) (res EventResult) { switch event.Action { - case events.ActionContainerStart, events.ActionContainerDie: + case events.ActionContainerStart, events.ActionContainerStop: break default: return @@ -96,13 +96,43 @@ func (p *DockerProvider) OnEvent(event W.Event, routes R.Routes) (res EventResul defer b.To(&res.err) routes.RangeAll(func(k string, v R.Route) { - if v.Entry().ContainerID == event.ActorID { + if v.Entry().ContainerID == event.ActorID || + v.Entry().ContainerName == event.ActorName { b.Add(v.Stop()) routes.Delete(k) res.nRemoved++ } }) + if res.nRemoved == 0 { // id & container name changed + // load all routes (rescan) + routesNew, err := p.LoadRoutesImpl() + routesOld := routes + if routesNew.Size() == 0 { + b.Add(E.FailWith("rescan routes", err)) + return + } + routesNew.Range(func(k string, v R.Route) bool { + if !routesOld.Has(k) { + routesOld.Store(k, v) + b.Add(v.Start()) + res.nAdded++ + return false + } + return true + }) + routesOld.Range(func(k string, v R.Route) bool { + if !routesNew.Has(k) { + b.Add(v.Stop()) + routesOld.Delete(k) + res.nRemoved++ + return false + } + return true + }) + return + } + client, err := D.ConnectClient(p.dockerHost) if err.HasError() { b.Add(E.FailWith("connect to docker", err)) diff --git a/internal/proxy/provider/provider.go b/internal/proxy/provider/provider.go index 3838d3f..a637422 100644 --- a/internal/proxy/provider/provider.go +++ b/internal/proxy/provider/provider.go @@ -176,7 +176,9 @@ func (p *Provider) watchEvents() { case event := <-events: res := p.OnEvent(event, p.routes) l.Infof("%s event %q", event.Type, event) - l.Infof("%d route added, %d routes removed", res.nAdded, res.nRemoved) + if res.nAdded > 0 || res.nRemoved > 0 { + l.Infof("%d route added, %d routes removed", res.nAdded, res.nRemoved) + } if res.err.HasError() { l.Error(res.err) } diff --git a/internal/route/http.go b/internal/route/http.go index 2386901..dadfabb 100755 --- a/internal/route/http.go +++ b/internal/route/http.go @@ -97,11 +97,6 @@ func NewHTTPRoute(entry *P.ReverseProxyEntry) (*HTTPRoute, E.NestedError) { httpRoutesMu.Lock() defer httpRoutesMu.Unlock() - _, exists := httpRoutes.Load(entry.Alias) - if exists { - return nil, E.Duplicated("HTTPRoute alias", entry.Alias) - } - r := &HTTPRoute{ Alias: entry.Alias, TargetURL: (*URL)(entry.URL), diff --git a/internal/watcher/docker_watcher.go b/internal/watcher/docker_watcher.go index 45c39e9..07b03c1 100644 --- a/internal/watcher/docker_watcher.go +++ b/internal/watcher/docker_watcher.go @@ -96,6 +96,8 @@ func (w DockerWatcher) EventsWithOptions(ctx context.Context, options DockerList } } + defer w.client.Close() + w.Debugf("client connected") cEventCh, cErrCh := w.client.Events(eventsCtx, options)