From 038e10f436c17bcecae5861d02b822a861af3ac5 Mon Sep 17 00:00:00 2001 From: Will Norris Date: Sat, 17 Jun 2017 08:49:21 -0400 Subject: [PATCH] reverseproxy: refactor error printing allow errors to specify HTTP status code that should be returned. --- third_party/httputil/reverseproxy.go | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/third_party/httputil/reverseproxy.go b/third_party/httputil/reverseproxy.go index d66dfa2..71f7093 100644 --- a/third_party/httputil/reverseproxy.go +++ b/third_party/httputil/reverseproxy.go @@ -130,8 +130,7 @@ func (p *ReverseProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) { } if err := p.Director(outreq); err != nil { - p.logf("http: proxy error: %v", err) - rw.WriteHeader(http.StatusBadGateway) + p.writeError(rw, err) return } @@ -182,8 +181,7 @@ func (p *ReverseProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) { res, err := transport.RoundTrip(outreq) if err != nil { - p.logf("http: proxy error: %v", err) - rw.WriteHeader(http.StatusBadGateway) + p.writeError(rw, err) return } @@ -203,8 +201,7 @@ func (p *ReverseProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) { if p.ModifyResponse != nil { if err := p.ModifyResponse(res); err != nil { - p.logf("http: proxy error: %v", err) - rw.WriteHeader(http.StatusBadGateway) + p.writeError(rw, err) return } } @@ -247,6 +244,20 @@ func (p *ReverseProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) { } } +// writerError writes err to the http response. +func (p *ReverseProxy) writeError(w http.ResponseWriter, err error) { + type statusCoder interface { + StatusCode() int + } + + p.logf("http: proxy error: %v", err) + code := http.StatusBadGateway + if err, ok := err.(statusCoder); ok { + code = err.StatusCode() + } + http.Error(w, err.Error(), code) +} + func (p *ReverseProxy) copyResponse(dst io.Writer, src io.Reader) { if p.FlushInterval != 0 { if wf, ok := dst.(writeFlusher); ok {