浏览代码

dockerd: force HTTP flush at each write (aka poor man's streaming)

Solomon Hykes 12 年之前
父节点
当前提交
f90183e957
共有 1 个文件被更改,包括 13 次插入1 次删除
  1. 13 1
      dockerd/dockerd.go

+ 13 - 1
dockerd/dockerd.go

@@ -160,6 +160,18 @@ func main() {
 	}
 }
 
+type AutoFlush struct {
+	http.ResponseWriter
+}
+
+func (w *AutoFlush) Write(data []byte) (int, error) {
+	ret, err := w.ResponseWriter.Write(data)
+	if flusher, ok := w.ResponseWriter.(http.Flusher); ok {
+		flusher.Flush()
+	}
+	return ret, err
+}
+
 func (docker *Docker) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 	cmd, args := URLToCall(r.URL)
 	log.Printf("%s\n", strings.Join(append(append([]string{"docker"}, cmd), args...), " "))
@@ -171,7 +183,7 @@ func (docker *Docker) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 	if method == nil {
 		docker.CmdUsage(r.Body, w, cmd)
 	} else {
-		err := method(r.Body, w, args...)
+		err := method(r.Body, &AutoFlush{w}, args...)
 		if err != nil {
 			fmt.Fprintf(w, "Error: %s\n", err)
 		}