From 57275a4912b61eb49395b05a734a7222b8598399 Mon Sep 17 00:00:00 2001 From: Joe Tsai Date: Mon, 1 Aug 2022 22:57:04 -0700 Subject: [PATCH] tsweb: add HTTPError.Header (#5251) The Header field allows the server to specify specific headers to set. Example use case: server returns 429 with the "Retry-After" header set. Signed-off-by: Joe Tsai --- tsweb/tsweb.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/tsweb/tsweb.go b/tsweb/tsweb.go index eb8ffb138..83a0ab077 100644 --- a/tsweb/tsweb.go +++ b/tsweb/tsweb.go @@ -298,7 +298,14 @@ func (h retHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { if h.opts.OnError != nil { h.opts.OnError(lw, r, hErr) } else { - http.Error(lw, hErr.Msg, msg.Code) + // Default headers set by http.Error. + lw.Header().Set("Content-Type", "text/plain; charset=utf-8") + lw.Header().Set("X-Content-Type-Options", "nosniff") + for k, vs := range hErr.Header { + lw.Header()[k] = vs + } + lw.WriteHeader(msg.Code) + fmt.Fprintln(lw, hErr.Msg) } case err != nil: // Handler returned a generic error. Serve an internal server @@ -405,9 +412,10 @@ func (l loggingResponseWriter) Flush() { // // It is the error type to be (optionally) used by Handler.ServeHTTPReturn. type HTTPError struct { - Code int // HTTP response code to send to client; 0 means means 500 - Msg string // Response body to send to client - Err error // Detailed error to log on the server + Code int // HTTP response code to send to client; 0 means means 500 + Msg string // Response body to send to client + Err error // Detailed error to log on the server + Header http.Header // Optional set of HTTP headers to set in the response } // Error implements the error interface.