diff --git a/circuitbreaker.go b/circuitbreaker.go index 620cd94..f7288a6 100644 --- a/circuitbreaker.go +++ b/circuitbreaker.go @@ -360,15 +360,23 @@ func (cb *Breaker) CallContext(ctx context.Context, circuit func() error, timeou } } - if err != nil { - if ctx.Err() != context.Canceled { + if err == nil { + cb.Success() + return nil + } + + switch ctx.Err() { + case context.Canceled: + case context.DeadlineExceeded: + // If the breaker timed out as well, report that, + // otherwise consider it "neutral". + if err == ErrBreakerTimeout { cb.Fail() } - return err + default: + cb.Fail() } - - cb.Success() - return nil + return err } // state returns the state of the TrippableBreaker. The states available are: diff --git a/client.go b/client.go index e91c52b..3127e07 100644 --- a/client.go +++ b/client.go @@ -94,7 +94,8 @@ func (c *HTTPClient) Do(req *http.Request) (*http.Response, error) { var resp *http.Response var err error breaker := c.breakerLookup(req.URL.String()) - err = breaker.Call(func() error { + ctx := req.Context() + err = breaker.CallContext(ctx, func() error { resp, err = c.Client.Do(req) return err }, c.timeout)