pkg/server/swapper.go (48 lines of code) (raw):

package server import ( "net/http" "sync" "github.com/gorilla/mux" ) var _ http.Handler = (*swapper)(nil) // swapper is an `http.Handler` which allows the user to swap out routers while the server is running. // This enables us to reset routes as the program is running, allowing for functionality like updating the config. type swapper struct { mu sync.Mutex router *mux.Router } func NewSwapper() *swapper { return &swapper{ mu: sync.Mutex{}, router: mux.NewRouter(), } } func (rs *swapper) Reset() { rs.mu.Lock() rs.router = mux.NewRouter() rs.mu.Unlock() } func (rs *swapper) Walk(f func(route *mux.Route, r *mux.Router, ancestors []*mux.Route) error) { rs.mu.Lock() rs.router.Walk(f) rs.mu.Unlock() } func (rs *swapper) HandleFuncPrefix(pattern string, requestHandler HandlerType) { rs.mu.Lock() rs.router.PathPrefix(pattern).HandlerFunc(requestHandler) rs.mu.Unlock() } func (rs *swapper) HandleFunc(pattern string, requestHandler HandlerType) { rs.mu.Lock() rs.router.HandleFunc(pattern, requestHandler) rs.mu.Unlock() } func (rs *swapper) Swap(newRouter *mux.Router) { rs.mu.Lock() rs.router = newRouter rs.mu.Unlock() } func (rs *swapper) ServeHTTP(w http.ResponseWriter, r *http.Request) { rs.mu.Lock() router := rs.router rs.mu.Unlock() router.ServeHTTP(w, r) }