From 09f4b85a66bace53cf1e6a808de53cdd17c59c08 Mon Sep 17 00:00:00 2001 From: Ivan Kozlovic Date: Thu, 27 Apr 2017 16:33:55 -0600 Subject: [PATCH] [ADDED] Ability to get the server's HTTP Handler This will allow applications (for instance NATS Streaming Server) to add new endpoints to the NATS http server. Resolves #480 --- server/monitor_test.go | 14 ++++++++++++++ server/pse/pse_darwin.go | 4 ++-- server/server.go | 16 ++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/server/monitor_test.go b/server/monitor_test.go index dac4398f..07c49fa8 100644 --- a/server/monitor_test.go +++ b/server/monitor_test.go @@ -1348,3 +1348,17 @@ func TestConcurrentMonitoring(t *testing.T) { default: } } + +func TestMonitorHandler(t *testing.T) { + s := runMonitorServer() + defer s.Shutdown() + handler := s.HTTPHandler() + if handler == nil { + t.Fatal("HTTP Handler should be set") + } + s.Shutdown() + handler = s.HTTPHandler() + if handler != nil { + t.Fatal("HTTP Handler should be nil") + } +} diff --git a/server/pse/pse_darwin.go b/server/pse/pse_darwin.go index 31ea2755..e1c2ae50 100644 --- a/server/pse/pse_darwin.go +++ b/server/pse/pse_darwin.go @@ -3,18 +3,18 @@ package pse import ( - "errors" "fmt" "os" "os/exec" ) +// ProcUsage returns CPU usage func ProcUsage(pcpu *float64, rss, vss *int64) error { pidStr := fmt.Sprintf("%d", os.Getpid()) out, err := exec.Command("ps", "o", "pcpu=,rss=,vsz=", "-p", pidStr).Output() if err != nil { *rss, *vss = -1, -1 - return errors.New(fmt.Sprintf("ps call failed:%v", err)) + return fmt.Errorf("ps call failed:%v", err) } fmt.Sscanf(string(out), "%f %d %d", pcpu, rss, vss) *rss *= 1024 // 1k blocks, want bytes. diff --git a/server/server.go b/server/server.go index 35fc1fdc..a82718f8 100644 --- a/server/server.go +++ b/server/server.go @@ -66,6 +66,7 @@ type Server struct { done chan bool start time.Time http net.Listener + httpHandler http.Handler httpReqStats map[string]uint64 routeListener net.Listener routeInfo Info @@ -505,14 +506,29 @@ func (s *Server) startMonitoring(secure bool) { WriteTimeout: 2 * time.Second, MaxHeaderBytes: 1 << 20, } + s.mu.Lock() + s.httpHandler = mux + s.mu.Unlock() go func() { srv.Serve(s.http) srv.Handler = nil + s.mu.Lock() + s.httpHandler = nil + s.mu.Unlock() s.done <- true }() } +// HTTPHandler returns the http.Handler object used to handle monitoring +// endpoints. It will return nil if the server is not configured for +// monitoring, or if the server has not been started yet (Server.Start()). +func (s *Server) HTTPHandler() http.Handler { + s.mu.Lock() + defer s.mu.Unlock() + return s.httpHandler +} + func (s *Server) createClient(conn net.Conn) *client { c := &client{srv: s, nc: conn, opts: defaultOpts, mpay: s.info.MaxPayload, start: time.Now()}