More accurate error message; merge multiple boolean variables into one error variable

This commit is contained in:
Charlie Getzen 2021-10-16 17:54:41 -05:00
parent 080cc9f6a7
commit 3bd7427b9c
1 changed files with 13 additions and 14 deletions

View File

@ -3304,7 +3304,10 @@ func TimeoutHandler(h Handler, dt time.Duration, msg string) Handler {
// ErrHandlerTimeout is returned on ResponseWriter Write calls
// in handlers which have timed out.
var ErrHandlerTimeout = errors.New("http: Handler timeout")
var ErrClientHangup = errors.New("http: Client hung up")
// ErrRequestCanceled is returned on ResponseWriter Write calls
// in handlers which have canceled contexts.
var ErrRequestCanceled = errors.New("http: Request canceled")
type timeoutHandler struct {
handler Handler
@ -3369,9 +3372,9 @@ func (h *timeoutHandler) ServeHTTP(w ResponseWriter, r *Request) {
case context.DeadlineExceeded:
w.WriteHeader(StatusServiceUnavailable)
io.WriteString(w, h.errorBody())
tw.timedOut = true
tw.err = ErrHandlerTimeout
case context.Canceled:
tw.clientHangup = true
tw.err = ErrRequestCanceled
}
}
}
@ -3382,11 +3385,10 @@ type timeoutWriter struct {
wbuf bytes.Buffer
req *Request
mu sync.Mutex
timedOut bool
clientHangup bool
wroteHeader bool
code int
mu sync.Mutex
err error
wroteHeader bool
code int
}
var _ Pusher = (*timeoutWriter)(nil)
@ -3404,11 +3406,8 @@ func (tw *timeoutWriter) Header() Header { return tw.h }
func (tw *timeoutWriter) Write(p []byte) (int, error) {
tw.mu.Lock()
defer tw.mu.Unlock()
if tw.timedOut {
return 0, ErrHandlerTimeout
}
if tw.clientHangup {
return 0, ErrClientHangup
if tw.err != nil {
return 0, tw.err
}
if !tw.wroteHeader {
tw.writeHeaderLocked(StatusOK)
@ -3420,7 +3419,7 @@ func (tw *timeoutWriter) writeHeaderLocked(code int) {
checkWriteHeaderCode(code)
switch {
case tw.timedOut, tw.clientHangup:
case tw.err != nil:
return
case tw.wroteHeader:
if tw.req != nil {