diff --git a/cmd/circologd/http.go b/cmd/circologd/http.go index d7f0121..3632f85 100644 --- a/cmd/circologd/http.go +++ b/cmd/circologd/http.go @@ -9,7 +9,7 @@ import ( "gopkg.in/mcuadros/go-syslog.v2/format" ) -func setupHttp(hub circolog.Hub) { +func setupHTTP(hub circolog.Hub) { http.HandleFunc("/", getHTTPHandler(hub)) http.HandleFunc("/ws", getWSHandler(hub)) } diff --git a/cmd/circologd/main.go b/cmd/circologd/main.go index 86dd18c..2364fe5 100644 --- a/cmd/circologd/main.go +++ b/cmd/circologd/main.go @@ -46,7 +46,7 @@ func main() { } go hub.Run() - setupHttp(hub) + setupHTTP(hub) if *querySocket != "" { fmt.Printf("Binding address `%s` [http]\n", *querySocket) unixListener, err := net.Listen("unix", *querySocket) diff --git a/hub.go b/hub.go index 0f2fa3b..b653dc1 100644 --- a/hub.go +++ b/hub.go @@ -38,35 +38,39 @@ func NewHub(ringBufSize int) Hub { } } +func (h *Hub) register(cl Client) { + if _, ok := h.clients[cl]; !ok { + if !cl.Nofollow { // we won't need it in future + h.clients[cl] = true + } + + circbufDoExit := false + h.circbuf.Do(func(x interface{}) { + if circbufDoExit { + return + } + if x != nil { + select { // send with short timeout + case cl.Messages <- x.(format.LogParts): + break + case <-time.After(500 * time.Millisecond): + circbufDoExit = true + break + } + } + }) + if cl.Nofollow { + close(cl.Messages) + } + } +} + // Run is hub main loop; keeps everything going func (h *Hub) Run() { for { select { case cl := <-h.Register: - if _, ok := h.clients[cl]; !ok { - if !cl.Nofollow { // we won't need it in future - h.clients[cl] = true - } - - circbuf_do_exit := false - h.circbuf.Do(func(x interface{}) { - if circbuf_do_exit { - return - } - if x != nil { - select { // send with short timeout - case cl.Messages <- x.(format.LogParts): - break - case <-time.After(500 * time.Millisecond): - circbuf_do_exit = true - break - } - } - }) - if cl.Nofollow { - close(cl.Messages) - } - } + h.register(cl) case cl := <-h.Unregister: _, ok := h.clients[cl] if ok {