mirror of
https://github.com/yusing/godoxy.git
synced 2025-06-09 04:52:35 +02:00
fixed route gone after container restart / Brename
This commit is contained in:
parent
a7a922308e
commit
aa16287447
6 changed files with 43 additions and 21 deletions
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
},
|
||||
}),
|
||||
}
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Reference in a new issue