summaryrefslogtreecommitdiff
path: root/modules/caddyhttp/reverseproxy
diff options
context:
space:
mode:
Diffstat (limited to 'modules/caddyhttp/reverseproxy')
-rw-r--r--modules/caddyhttp/reverseproxy/reverseproxy.go8
-rw-r--r--modules/caddyhttp/reverseproxy/streaming.go5
2 files changed, 13 insertions, 0 deletions
diff --git a/modules/caddyhttp/reverseproxy/reverseproxy.go b/modules/caddyhttp/reverseproxy/reverseproxy.go
index bb1453a..0a53db4 100644
--- a/modules/caddyhttp/reverseproxy/reverseproxy.go
+++ b/modules/caddyhttp/reverseproxy/reverseproxy.go
@@ -611,6 +611,14 @@ func (h *Handler) reverseProxy(rw http.ResponseWriter, req *http.Request, di Dia
rw.WriteHeader(res.StatusCode)
+ // some apps need the response headers before starting to stream content with http2,
+ // so it's important to explicitly flush the headers to the client before streaming the data.
+ // (see https://github.com/caddyserver/caddy/issues/3556 for use case)
+ if req.ProtoMajor == 2 && res.ContentLength == -1 {
+ if wf, ok := rw.(http.Flusher); ok {
+ wf.Flush()
+ }
+ }
err = h.copyResponse(rw, res.Body, h.flushInterval(req, res))
res.Body.Close() // close now, instead of defer, to populate res.Trailer
if err != nil {
diff --git a/modules/caddyhttp/reverseproxy/streaming.go b/modules/caddyhttp/reverseproxy/streaming.go
index 8a7c6f7..105ff32 100644
--- a/modules/caddyhttp/reverseproxy/streaming.go
+++ b/modules/caddyhttp/reverseproxy/streaming.go
@@ -96,6 +96,11 @@ func (h Handler) flushInterval(req *http.Request, res *http.Response) time.Durat
return -1 // negative means immediately
}
+ // for h2 and h2c upstream streaming data to client (issue #3556)
+ if req.ProtoMajor == 2 && res.ContentLength == -1 {
+ return -1
+ }
+
// TODO: more specific cases? e.g. res.ContentLength == -1? (this TODO is from the std lib)
return time.Duration(h.FlushInterval)
}