Merge pull request #180 from sgotti/api_write_flush_logs_headers

*: write and flush header on log handlers
This commit is contained in:
Simone Gotti 2019-11-15 10:18:28 +01:00 committed by GitHub
commit 5fe3ceb60c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 30 additions and 3 deletions

View File

@ -137,10 +137,17 @@ func (h *logsHandler) readLogs(taskID string, setup bool, step int, logPath stri
w.Header().Set("Content-Length", strconv.FormatInt(fi.Size(), 10)) w.Header().Set("Content-Length", strconv.FormatInt(fi.Size(), 10))
} }
// write and flush the headers so the client will receive the response
// header also if there're currently no lines to send
w.WriteHeader(http.StatusOK)
var flusher http.Flusher var flusher http.Flusher
if fl, ok := w.(http.Flusher); ok { if fl, ok := w.(http.Flusher); ok {
flusher = fl flusher = fl
} }
if flusher != nil {
flusher.Flush()
}
stop := false stop := false
flushstop := false flushstop := false
for { for {

View File

@ -451,8 +451,18 @@ func (h *LogsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
return return
} }
// write and flush the headers so the client will receive the response
// header also if there're currently no lines to send
w.Header().Set("Cache-Control", "no-cache") w.Header().Set("Cache-Control", "no-cache")
w.Header().Set("Connection", "keep-alive") w.Header().Set("Connection", "keep-alive")
w.WriteHeader(http.StatusOK)
var flusher http.Flusher
if fl, ok := w.(http.Flusher); ok {
flusher = fl
}
if flusher != nil {
flusher.Flush()
}
defer resp.Body.Close() defer resp.Body.Close()
if err := sendLogs(w, resp.Body); err != nil { if err := sendLogs(w, resp.Body); err != nil {

View File

@ -275,13 +275,23 @@ func (h *LogsHandler) readTaskLogs(ctx context.Context, runID, taskID string, se
return errors.Errorf("received http status: %d", req.StatusCode), true return errors.Errorf("received http status: %d", req.StatusCode), true
} }
// write and flush the headers so the client will receive the response
// header also if there're currently no lines to send
w.Header().Set("Cache-Control", "no-cache")
w.Header().Set("Connection", "keep-alive")
w.WriteHeader(http.StatusOK)
var flusher http.Flusher
if fl, ok := w.(http.Flusher); ok {
flusher = fl
}
if flusher != nil {
flusher.Flush()
}
return sendLogs(w, req.Body), false return sendLogs(w, req.Body), false
} }
func sendLogs(w http.ResponseWriter, r io.Reader) error { func sendLogs(w http.ResponseWriter, r io.Reader) error {
w.Header().Set("Cache-Control", "no-cache")
w.Header().Set("Connection", "keep-alive")
buf := make([]byte, 406) buf := make([]byte, 406)
var flusher http.Flusher var flusher http.Flusher