diff --git a/util/request/functions.go b/util/request/functions.go index ab6918ad8..cd2ee0ddc 100644 --- a/util/request/functions.go +++ b/util/request/functions.go @@ -41,6 +41,16 @@ func (e StatusError) StatusCode() int { return e.resp.StatusCode } +// HasStatus returns true if the respose's status code matches any of the given codes +func (e StatusError) HasStatus(codes ...int) bool { + for _, code := range codes { + if e.resp.StatusCode == code { + return true + } + } + return false +} + // ReadBody reads HTTP response and returns error on response codes other than HTTP 2xx func ReadBody(resp *http.Response) ([]byte, error) { defer resp.Body.Close() diff --git a/vehicle/bluelink/bluelink.go b/vehicle/bluelink/bluelink.go index a01c4697d..bb2d6913e 100644 --- a/vehicle/bluelink/bluelink.go +++ b/vehicle/bluelink/bluelink.go @@ -293,8 +293,8 @@ func (v *API) getStatus() (float64, error) { err = v.DoJSON(req, &resp) if err != nil { - resp := v.LastResponse() - if resp != nil && resp.StatusCode == http.StatusForbidden { + // handle http 401, 403 + if se, ok := err.(request.StatusError); ok && se.HasStatus(http.StatusUnauthorized, http.StatusForbidden) { err = errAuthFail } }