func (eh *eventsHandler) Handle(e *cluster.Event) error { eh.RLock() str := fmt.Sprintf("{%q:%q,%q:%q,%q:%q,%q:%d,%q:%s}", "status", e.Status, "id", e.Id, "from", e.From+" node:"+e.Node.Name(), "time", e.Time, "node", cluster.SerializeNode(e.Node)) for key, w := range eh.ws { if _, err := fmt.Fprintf(w, str); err != nil { close(eh.cs[key]) delete(eh.ws, key) delete(eh.cs, key) continue } if f, ok := w.(http.Flusher); ok { f.Flush() } } eh.RUnlock() return nil }
// GET /containers/{name:.*}/json func getContainerJSON(c *context, w http.ResponseWriter, r *http.Request) { name := mux.Vars(r)["name"] container := c.cluster.Container(name) if container == nil { httpError(w, fmt.Sprintf("No such container %s", name), http.StatusNotFound) return } client, scheme := newClientAndScheme(c.tlsConfig) resp, err := client.Get(scheme + "://" + container.Node.Addr() + "/containers/" + container.Id + "/json") if err != nil { httpError(w, err.Error(), http.StatusInternalServerError) return } // cleanup defer resp.Body.Close() defer closeIdleConnections(client) data, err := ioutil.ReadAll(resp.Body) if err != nil { httpError(w, err.Error(), http.StatusInternalServerError) return } // insert Node field data = bytes.Replace(data, []byte("\"Name\":\"/"), []byte(fmt.Sprintf("\"Node\":%s,\"Name\":\"/", cluster.SerializeNode(container.Node))), -1) // insert node IP data = bytes.Replace(data, []byte("\"HostIp\":\"0.0.0.0\""), []byte(fmt.Sprintf("\"HostIp\":%q", container.Node.IP())), -1) w.Header().Set("Content-Type", "application/json") w.Write(data) }