Просмотр исходного кода

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

Solomon Hykes 12 лет назад
Родитель
Сommit
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) {
 func (docker *Docker) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 	cmd, args := URLToCall(r.URL)
 	cmd, args := URLToCall(r.URL)
 	log.Printf("%s\n", strings.Join(append(append([]string{"docker"}, cmd), args...), " "))
 	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 {
 	if method == nil {
 		docker.CmdUsage(r.Body, w, cmd)
 		docker.CmdUsage(r.Body, w, cmd)
 	} else {
 	} else {
-		err := method(r.Body, w, args...)
+		err := method(r.Body, &AutoFlush{w}, args...)
 		if err != nil {
 		if err != nil {
 			fmt.Fprintf(w, "Error: %s\n", err)
 			fmt.Fprintf(w, "Error: %s\n", err)
 		}
 		}