I am using socketio "github.com/googollee/go-socket.io"
in Go. For some reason, I have to make a new *socketio.server and register it to "/static/"
which is already been registered with the old *socketio.server.
It means that I have to replace the handler ioserver in http.Handle("/socket.io/", ioserver)
after the server has been started.
Below is part of my code, when something happens, I will create a new ioserver. I want the new ioserver to be the handler in http.Handle("/socket.io/", ioserver)
ioserver, _ = socketio.NewServer(nil)
http.Handle("/socket.io/", ioserver)
log.Fatal(http.ListenAndServe(":81", nil))
An application cannot swap handlers in the mux, but it can write a handler that swaps between other handlers:
type swapper struct {
mu sync.Mutex
h http.Handler
}
func (s *swapper) setHandler(h http.Handler) {
s.mu.Lock()
s.h = h
s.mu.Unlock()
}
func (w *swapper) ServeHTTP(w http.ResponseWriter, r *http.Request) {
s.mu.Lock()
h := s.h
s.mu.Unlock()
h.ServeHTTP(w, r)
}
Register it like this:
ioserver, _ = socketio.NewServer(nil)
s := &swapper{}
s.setHandler(ioserver)
http.Handle("/socket.io/", s)
log.Fatal(http.ListenAndServe(":81", nil))
At any time, the application can call s.setHandler to swap in a new handler.