mirror of
https://github.com/yusing/godoxy.git
synced 2025-06-09 13:02:33 +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 (
|
import (
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
|
||||||
|
|
||||||
D "github.com/yusing/go-proxy/internal/docker"
|
D "github.com/yusing/go-proxy/internal/docker"
|
||||||
E "github.com/yusing/go-proxy/internal/error"
|
E "github.com/yusing/go-proxy/internal/error"
|
||||||
|
@ -52,11 +51,8 @@ var realIPOptsDefault = func() *realIPOpts {
|
||||||
func NewRealIP(opts OptionsRaw) (*Middleware, E.NestedError) {
|
func NewRealIP(opts OptionsRaw) (*Middleware, E.NestedError) {
|
||||||
riWithOpts := new(realIP)
|
riWithOpts := new(realIP)
|
||||||
riWithOpts.m = &Middleware{
|
riWithOpts.m = &Middleware{
|
||||||
impl: riWithOpts,
|
impl: riWithOpts,
|
||||||
before: func(next http.HandlerFunc, w ResponseWriter, r *Request) {
|
before: Rewrite(riWithOpts.setRealIP),
|
||||||
riWithOpts.setRealIP(r)
|
|
||||||
next(w, r)
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
riWithOpts.realIPOpts = realIPOptsDefault()
|
riWithOpts.realIPOpts = realIPOptsDefault()
|
||||||
err := Deserialize(opts, riWithOpts.realIPOpts)
|
err := Deserialize(opts, riWithOpts.realIPOpts)
|
||||||
|
|
|
@ -2,7 +2,6 @@ package middleware
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -15,7 +14,7 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
var SetXForwarded = &Middleware{
|
var SetXForwarded = &Middleware{
|
||||||
before: func(next http.HandlerFunc, w ResponseWriter, req *Request) {
|
before: Rewrite(func(req *Request) {
|
||||||
req.Header.Del("Forwarded")
|
req.Header.Del("Forwarded")
|
||||||
req.Header.Del(xForwardedFor)
|
req.Header.Del(xForwardedFor)
|
||||||
req.Header.Del(xForwardedHost)
|
req.Header.Del(xForwardedHost)
|
||||||
|
@ -32,16 +31,14 @@ var SetXForwarded = &Middleware{
|
||||||
} else {
|
} else {
|
||||||
req.Header.Set(xForwardedProto, "https")
|
req.Header.Set(xForwardedProto, "https")
|
||||||
}
|
}
|
||||||
next(w, req)
|
}),
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var HideXForwarded = &Middleware{
|
var HideXForwarded = &Middleware{
|
||||||
before: func(next http.HandlerFunc, w ResponseWriter, req *Request) {
|
before: Rewrite(func(req *Request) {
|
||||||
req.Header.Del("Forwarded")
|
req.Header.Del("Forwarded")
|
||||||
req.Header.Del(xForwardedFor)
|
req.Header.Del(xForwardedFor)
|
||||||
req.Header.Del(xForwardedHost)
|
req.Header.Del(xForwardedHost)
|
||||||
req.Header.Del(xForwardedProto)
|
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) {
|
func (p *DockerProvider) OnEvent(event W.Event, routes R.Routes) (res EventResult) {
|
||||||
switch event.Action {
|
switch event.Action {
|
||||||
case events.ActionContainerStart, events.ActionContainerDie:
|
case events.ActionContainerStart, events.ActionContainerStop:
|
||||||
break
|
break
|
||||||
default:
|
default:
|
||||||
return
|
return
|
||||||
|
@ -96,13 +96,43 @@ func (p *DockerProvider) OnEvent(event W.Event, routes R.Routes) (res EventResul
|
||||||
defer b.To(&res.err)
|
defer b.To(&res.err)
|
||||||
|
|
||||||
routes.RangeAll(func(k string, v R.Route) {
|
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())
|
b.Add(v.Stop())
|
||||||
routes.Delete(k)
|
routes.Delete(k)
|
||||||
res.nRemoved++
|
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)
|
client, err := D.ConnectClient(p.dockerHost)
|
||||||
if err.HasError() {
|
if err.HasError() {
|
||||||
b.Add(E.FailWith("connect to docker", err))
|
b.Add(E.FailWith("connect to docker", err))
|
||||||
|
|
|
@ -176,7 +176,9 @@ func (p *Provider) watchEvents() {
|
||||||
case event := <-events:
|
case event := <-events:
|
||||||
res := p.OnEvent(event, p.routes)
|
res := p.OnEvent(event, p.routes)
|
||||||
l.Infof("%s event %q", event.Type, event)
|
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() {
|
if res.err.HasError() {
|
||||||
l.Error(res.err)
|
l.Error(res.err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,11 +97,6 @@ func NewHTTPRoute(entry *P.ReverseProxyEntry) (*HTTPRoute, E.NestedError) {
|
||||||
httpRoutesMu.Lock()
|
httpRoutesMu.Lock()
|
||||||
defer httpRoutesMu.Unlock()
|
defer httpRoutesMu.Unlock()
|
||||||
|
|
||||||
_, exists := httpRoutes.Load(entry.Alias)
|
|
||||||
if exists {
|
|
||||||
return nil, E.Duplicated("HTTPRoute alias", entry.Alias)
|
|
||||||
}
|
|
||||||
|
|
||||||
r := &HTTPRoute{
|
r := &HTTPRoute{
|
||||||
Alias: entry.Alias,
|
Alias: entry.Alias,
|
||||||
TargetURL: (*URL)(entry.URL),
|
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")
|
w.Debugf("client connected")
|
||||||
|
|
||||||
cEventCh, cErrCh := w.client.Events(eventsCtx, options)
|
cEventCh, cErrCh := w.client.Events(eventsCtx, options)
|
||||||
|
|
Loading…
Add table
Reference in a new issue