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.
This commit is contained in:
Matthew Holt 2016-04-09 00:17:15 -06:00
parent c21ff8343c
commit 3faad41b43
No known key found for this signature in database
GPG Key ID: 0D97CC73664F4D03
2 changed files with 9 additions and 1 deletions

View File

@ -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()),

View File

@ -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()
}
}