That way we can know when the stream has been flushed.
Signed-off-by: David Calavera <david.calavera@gmail.com>
| ... | ... |
@@ -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 {
|