func LogStreamer() http.Handler { logs := mux.NewRouter() logsHandler := func(w http.ResponseWriter, req *http.Request) { params := mux.Vars(req) route := new(router.Route) if params["value"] != "" { switch params["predicate"] { case "id": route.FilterID = params["value"] if len(route.ID) > 12 { route.FilterID = route.FilterID[:12] } case "name": route.FilterName = params["value"] } } if route.FilterID != "" && !router.Routes.RoutingFrom(route.FilterID) { http.NotFound(w, req) return } defer debug("http: logs streamer disconnected") logstream := make(chan *router.Message) defer close(logstream) var closer <-chan bool if req.Header.Get("Upgrade") == "websocket" { debug("http: logs streamer connected [websocket]") closerBi := make(chan bool) defer websocketStreamer(w, req, logstream, closerBi) closer = closerBi } else { debug("http: logs streamer connected [http]") defer httpStreamer(w, req, logstream, route.MultiContainer()) closer = w.(http.CloseNotifier).CloseNotify() } route.OverrideCloser(closer) router.Routes.Route(route, logstream) } logs.HandleFunc("/logs/{predicate:[a-zA-Z]+}:{value}", logsHandler).Methods("GET") logs.HandleFunc("/logs", logsHandler).Methods("GET") return logs }