diff options
Diffstat (limited to 'src/hub/src/spreadspace.org/sfive/s5srvWeb.go')
-rw-r--r-- | src/hub/src/spreadspace.org/sfive/s5srvWeb.go | 47 |
1 files changed, 26 insertions, 21 deletions
diff --git a/src/hub/src/spreadspace.org/sfive/s5srvWeb.go b/src/hub/src/spreadspace.org/sfive/s5srvWeb.go index a112585..65e677a 100644 --- a/src/hub/src/spreadspace.org/sfive/s5srvWeb.go +++ b/src/hub/src/spreadspace.org/sfive/s5srvWeb.go @@ -397,26 +397,11 @@ func (ln tcpKeepAliveListener) Accept() (c net.Conn, err error) { return tc, nil } -func (srv *Server) webRun(listener *net.TCPListener) (err error) { - mux := http.NewServeMux() - mux.Handle("/healthz", webHandler{srv, webHealthz}) - mux.Handle("/hubs", webHandler{srv, webHubs}) - mux.Handle("/sources", webHandler{srv, webSources}) - mux.Handle("/clients", webHandler{srv, webClients}) - mux.Handle("/updates/", webHandler{srv, webUpdatesWithParam}) - mux.Handle("/updates", webHandler{srv, webUpdates}) - mux.Handle("/lastupdate/", webHandler{srv, webLastUpdateIDForUUID}) - mux.Handle("/lastupdate", webHandler{srv, webLastUpdateID}) - - // mux.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir( ..staticDir.. )))) - mux.Handle("/", webHandler{srv, webNotFound}) - - srv.interfaces.web = &http.Server{Handler: mux, ReadTimeout: 60 * time.Second, WriteTimeout: 60 * time.Second} - return srv.interfaces.web.Serve(tcpKeepAliveListener{listener}) +func (srv *Server) webRun(listener *net.TCPListener) { + srv.interfaces.web.Serve(tcpKeepAliveListener{listener}) } func (srv *Server) webStop(ctx context.Context) (err error) { - // TODO: this is a race condition between a call to webRun and webStop... if srv.interfaces.web == nil { return nil } @@ -424,15 +409,35 @@ func (srv *Server) webStop(ctx context.Context) (err error) { return srv.interfaces.web.Shutdown(ctx) } -func (srv *Server) ServeWeb(cfg WebInterfaceConfig) { +func (srv *Server) ServeWeb(cfg WebInterfaceConfig) error { ln, err := net.Listen("tcp", cfg.ListenAddr) if err != nil { s5l.Printf("srv|web: listen() failed: %v", err) - return + return err } s5l.Printf("srv|web: listening on '%s'", cfg.ListenAddr) - defer s5l.Println("srv|web: interface stopped") - srv.webRun(ln.(*net.TCPListener)) + mux := http.NewServeMux() + mux.Handle("/healthz", webHandler{srv, webHealthz}) + mux.Handle("/hubs", webHandler{srv, webHubs}) + mux.Handle("/sources", webHandler{srv, webSources}) + mux.Handle("/clients", webHandler{srv, webClients}) + mux.Handle("/updates/", webHandler{srv, webUpdatesWithParam}) + mux.Handle("/updates", webHandler{srv, webUpdates}) + mux.Handle("/lastupdate/", webHandler{srv, webLastUpdateIDForUUID}) + mux.Handle("/lastupdate", webHandler{srv, webLastUpdateID}) + // mux.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir( ..staticDir.. )))) + mux.Handle("/", webHandler{srv, webNotFound}) + + srv.interfaces.web = &http.Server{Handler: mux, ReadTimeout: 60 * time.Second, WriteTimeout: 60 * time.Second} + + srv.wgInterfaces.Add(1) + go func() { + defer srv.wgInterfaces.Done() + defer s5l.Println("srv|web: interface stopped listening") + + srv.webRun(ln.(*net.TCPListener)) + }() + return nil } |