From 7fd9eccc386c8a6ff7f2b83f6ef4b58e4d8026be Mon Sep 17 00:00:00 2001 From: Peter Waller Date: Tue, 30 Dec 2014 12:19:43 +0000 Subject: [PATCH] Implement ReverseProxy request cancellation Fixes #8406 --- src/net/http/httputil/reverseproxy.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/net/http/httputil/reverseproxy.go b/src/net/http/httputil/reverseproxy.go index ab463701803bd..524e28011ff64 100644 --- a/src/net/http/httputil/reverseproxy.go +++ b/src/net/http/httputil/reverseproxy.go @@ -109,6 +109,21 @@ func (p *ReverseProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) { outreq := new(http.Request) *outreq = *req // includes shallow copies of maps, but okay + go func() { + cn, ok := rw.(http.CloseNotifier) + if !ok { + // In this case, rw may have been wrapped and there is nothing + // that can be done. + return + } + <-cn.CloseNotify() + t, ok := transport.(*http.Transport) + if !ok { + return + } + t.CancelRequest(outreq) + }() + p.Director(outreq) outreq.Proto = "HTTP/1.1" outreq.ProtoMajor = 1