From 3faad41b437c48cea37863123fab425169bc0c6e Mon Sep 17 00:00:00 2001 From: Matthew Holt Date: Sat, 9 Apr 2016 00:17:15 -0600 Subject: [PATCH] middleware: ResponseRecorder now is an http.Flusher (fixes #677) Flush every 250ms. This should keep latency somewhat low but there is still buffering; maybe in the future we can make this configurable. --- middleware/proxy/reverseproxy.go | 2 +- middleware/recorder.go | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/middleware/proxy/reverseproxy.go b/middleware/proxy/reverseproxy.go index 384ea6cde..05538dfc2 100644 --- a/middleware/proxy/reverseproxy.go +++ b/middleware/proxy/reverseproxy.go @@ -111,7 +111,7 @@ func NewSingleHostReverseProxy(target *url.URL, without string) *ReverseProxy { req.URL.Path = strings.TrimPrefix(req.URL.Path, without) } } - rp := &ReverseProxy{Director: director} + rp := &ReverseProxy{Director: director, FlushInterval: 250 * time.Millisecond} // flushing good for streaming & server-sent events if target.Scheme == "unix" { rp.Transport = &http.Transport{ Dial: socketDial(target.String()), diff --git a/middleware/recorder.go b/middleware/recorder.go index 585c5c335..44d277365 100644 --- a/middleware/recorder.go +++ b/middleware/recorder.go @@ -77,3 +77,11 @@ func (r *ResponseRecorder) Hijack() (net.Conn, *bufio.ReadWriter, error) { } return nil, nil, errors.New("not a Hijacker") } + +// Flush implements http.Flusher. It simply wraps the underlying +// ResponseWriter's Flush method if there is one, or does nothing. +func (r *ResponseRecorder) Flush() { + if f, ok := r.ResponseWriter.(http.Flusher); ok { + f.Flush() + } +}