Commit 4f5df39b authored by Matthew Holt's avatar Matthew Holt

caddy: Re-invoke listener middlewares on reloads and upgrades

parent 1f8d1df4
...@@ -388,6 +388,11 @@ type GracefulServer interface { ...@@ -388,6 +388,11 @@ type GracefulServer interface {
// address; you must store the address the // address; you must store the address the
// server is to serve on some other way. // server is to serve on some other way.
Address() string Address() string
// WrapListener wraps a listener with the
// listener middlewares configured for this
// server, if any.
WrapListener(net.Listener) net.Listener
} }
// Listener is a net.Listener with an underlying file descriptor. // Listener is a net.Listener with an underlying file descriptor.
...@@ -744,6 +749,7 @@ func startServers(serverList []Server, inst *Instance, restartFds map[string]res ...@@ -744,6 +749,7 @@ func startServers(serverList []Server, inst *Instance, restartFds map[string]res
return err return err
} }
} }
ln = gs.WrapListener(ln)
} }
} }
...@@ -782,6 +788,7 @@ func startServers(serverList []Server, inst *Instance, restartFds map[string]res ...@@ -782,6 +788,7 @@ func startServers(serverList []Server, inst *Instance, restartFds map[string]res
return err return err
} }
} }
ln = gs.WrapListener(ln)
} }
} }
......
...@@ -274,16 +274,26 @@ func (s *Server) Listen() (net.Listener, error) { ...@@ -274,16 +274,26 @@ func (s *Server) Listen() (net.Listener, error) {
ln = tcpKeepAliveListener{TCPListener: tcpLn} ln = tcpKeepAliveListener{TCPListener: tcpLn}
} }
cln := s.WrapListener(ln)
// Very important to return a concrete caddy.Listener
// implementation for graceful restarts.
return cln.(caddy.Listener), nil
}
// WrapListener wraps ln in the listener middlewares configured
// for this server.
func (s *Server) WrapListener(ln net.Listener) net.Listener {
if ln == nil {
return nil
}
cln := ln.(caddy.Listener) cln := ln.(caddy.Listener)
for _, site := range s.sites { for _, site := range s.sites {
for _, m := range site.listenerMiddleware { for _, m := range site.listenerMiddleware {
cln = m(cln) cln = m(cln)
} }
} }
return cln
// Very important to return a concrete caddy.Listener
// implementation for graceful restarts.
return cln.(caddy.Listener), nil
} }
// ListenPacket creates udp connection for QUIC if it is enabled, // ListenPacket creates udp connection for QUIC if it is enabled,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment