mirror of
https://github.com/ipfs/kubo.git
synced 2025-06-27 07:57:30 +08:00
fix streaming output to flush per write
License: MIT Signed-off-by: Jeromy <jeromyj@gmail.com>
This commit is contained in:
@ -245,13 +245,45 @@ func sendResponse(w http.ResponseWriter, r *http.Request, res cmds.Response, req
|
|||||||
}
|
}
|
||||||
|
|
||||||
w.WriteHeader(status)
|
w.WriteHeader(status)
|
||||||
_, err = io.Copy(w, out)
|
err = flushCopy(w, out)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("err: ", err)
|
log.Error("err: ", err)
|
||||||
w.Header().Set(StreamErrHeader, sanitizedErrStr(err))
|
w.Header().Set(StreamErrHeader, sanitizedErrStr(err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func flushCopy(w io.Writer, r io.Reader) error {
|
||||||
|
buf := make([]byte, 4096)
|
||||||
|
f, ok := w.(http.Flusher)
|
||||||
|
if !ok {
|
||||||
|
_, err := io.Copy(w, r)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for {
|
||||||
|
n, err := r.Read(buf)
|
||||||
|
switch err {
|
||||||
|
case io.EOF:
|
||||||
|
return nil
|
||||||
|
case nil:
|
||||||
|
// continue
|
||||||
|
default:
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
nw, err := w.Write(buf[:n])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if nw != n {
|
||||||
|
return fmt.Errorf("http write failed to write full amount: %d != %d", nw, n)
|
||||||
|
}
|
||||||
|
|
||||||
|
f.Flush()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func sanitizedErrStr(err error) string {
|
func sanitizedErrStr(err error) string {
|
||||||
s := err.Error()
|
s := err.Error()
|
||||||
s = strings.Split(s, "\n")[0]
|
s = strings.Split(s, "\n")[0]
|
||||||
|
Reference in New Issue
Block a user