// get byte slices for use by io.CopyBuffer when
        // copying HTTP response bodies.
        BufferPool BufferPool
+
+       // ModifyResponse is an optional function that
+       // modifies the Response from the backend.
+       // If it returns an error, the proxy returns a StatusBadGateway error.
+       ModifyResponse func(*http.Response) error
 }
 
 // A BufferPool is an interface for getting and returning temporary
                res.Header.Del(h)
        }
 
+       if p.ModifyResponse != nil {
+               if err := p.ModifyResponse(res); err != nil {
+                       p.logf("http: proxy error: %v", err)
+                       rw.WriteHeader(http.StatusBadGateway)
+                       return
+               }
+       }
+
        copyHeader(rw.Header(), res.Header)
 
        // The "Trailer" header isn't included in the Transport's response,
 
        }
 }
 
+// Issue 14237. Test ModifyResponse and that an error from it
+// causes the proxy to return StatusBadGateway, or StatusOK otherwise.
+func TestReverseProxyModifyResponse(t *testing.T) {
+       backendServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+               w.Header().Add("X-Hit-Mod", fmt.Sprintf("%v", r.URL.Path == "/mod"))
+       }))
+       defer backendServer.Close()
+
+       rpURL, _ := url.Parse(backendServer.URL)
+       rproxy := NewSingleHostReverseProxy(rpURL)
+       rproxy.ErrorLog = log.New(ioutil.Discard, "", 0) // quiet for tests
+       rproxy.ModifyResponse = func(resp *http.Response) error {
+               if resp.Header.Get("X-Hit-Mod") != "true" {
+                       return fmt.Errorf("tried to by-pass proxy")
+               }
+               return nil
+       }
+
+       frontendProxy := httptest.NewServer(rproxy)
+       defer frontendProxy.Close()
+
+       tests := []struct {
+               url      string
+               wantCode int
+       }{
+               {frontendProxy.URL + "/mod", http.StatusOK},
+               {frontendProxy.URL + "/schedule", http.StatusBadGateway},
+       }
+
+       for i, tt := range tests {
+               resp, err := http.Get(tt.url)
+               if err != nil {
+                       t.Fatalf("failed to reach proxy: %v", err)
+               }
+               if g, e := resp.StatusCode, tt.wantCode; g != e {
+                       t.Errorf("#%d: got res.StatusCode %d; expected %d", i, g, e)
+               }
+               resp.Body.Close()
+       }
+}
+
 // Issue 16659: log errors from short read
 func TestReverseProxy_CopyBuffer(t *testing.T) {
        backendServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {