Browse code

Add flusher check to utils.WriteFlusher.

That way we can know when the stream has been flushed.

Signed-off-by: David Calavera <david.calavera@gmail.com>

David Calavera authored on 2015/04/21 06:18:14
Showing 2 changed files
... ...
@@ -1285,9 +1285,6 @@ func (s *Server) postBuild(eng *engine.Engine, version version.Version, w http.R
1285 1285
 		}
1286 1286
 	}
1287 1287
 
1288
-	stdout := engine.NewOutput()
1289
-	stdout.Set(utils.NewWriteFlusher(w))
1290
-
1291 1288
 	if version.GreaterThanOrEqualTo("1.8") {
1292 1289
 		w.Header().Set("Content-Type", "application/json")
1293 1290
 		buildConfig.JSONFormat = true
... ...
@@ -1304,7 +1301,8 @@ func (s *Server) postBuild(eng *engine.Engine, version version.Version, w http.R
1304 1304
 		buildConfig.Pull = true
1305 1305
 	}
1306 1306
 
1307
-	buildConfig.Stdout = stdout
1307
+	output := utils.NewWriteFlusher(w)
1308
+	buildConfig.Stdout = output
1308 1309
 	buildConfig.Context = r.Body
1309 1310
 
1310 1311
 	buildConfig.RemoteURL = r.FormValue("remote")
... ...
@@ -1336,7 +1334,9 @@ func (s *Server) postBuild(eng *engine.Engine, version version.Version, w http.R
1336 1336
 	}
1337 1337
 
1338 1338
 	if err := builder.Build(s.daemon, eng, buildConfig); err != nil {
1339
-		if !stdout.Used() {
1339
+		// Do not write the error in the http output if it's still empty.
1340
+		// This prevents from writing a 200(OK) when there is an interal error.
1341
+		if !output.Flushed() {
1340 1342
 			return err
1341 1343
 		}
1342 1344
 		sf := streamformatter.NewStreamFormatter(version.GreaterThanOrEqualTo("1.8"))
... ...
@@ -128,12 +128,14 @@ type WriteFlusher struct {
128 128
 	sync.Mutex
129 129
 	w       io.Writer
130 130
 	flusher http.Flusher
131
+	flushed bool
131 132
 }
132 133
 
133 134
 func (wf *WriteFlusher) Write(b []byte) (n int, err error) {
134 135
 	wf.Lock()
135 136
 	defer wf.Unlock()
136 137
 	n, err = wf.w.Write(b)
138
+	wf.flushed = true
137 139
 	wf.flusher.Flush()
138 140
 	return n, err
139 141
 }
... ...
@@ -142,9 +144,16 @@ func (wf *WriteFlusher) Write(b []byte) (n int, err error) {
142 142
 func (wf *WriteFlusher) Flush() {
143 143
 	wf.Lock()
144 144
 	defer wf.Unlock()
145
+	wf.flushed = true
145 146
 	wf.flusher.Flush()
146 147
 }
147 148
 
149
+func (wf *WriteFlusher) Flushed() bool {
150
+	wf.Lock()
151
+	defer wf.Unlock()
152
+	return wf.flushed
153
+}
154
+
148 155
 func NewWriteFlusher(w io.Writer) *WriteFlusher {
149 156
 	var flusher http.Flusher
150 157
 	if f, ok := w.(http.Flusher); ok {