From 74d2deef4dcf00afca1b8574dd327e716cc9a491 Mon Sep 17 00:00:00 2001 From: viktor Date: Sun, 14 Apr 2024 21:44:54 +0800 Subject: [PATCH] handle error response compatible --- client.go | 35 +++++++++++++++++++++++++---------- error.go | 4 ++++ 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/client.go b/client.go index 9a1c8958d..17b3d1504 100644 --- a/client.go +++ b/client.go @@ -251,21 +251,36 @@ func (c *Client) fullURL(suffix string, args ...any) string { } func (c *Client) handleErrorResp(resp *http.Response) error { - var errRes ErrorResponse - err := json.NewDecoder(resp.Body).Decode(&errRes) - if err != nil || errRes.Error == nil { - reqErr := &RequestError{ + var errResp ErrorResponse + var compErrResp CompatibleErrorResponse + + bodyBytes, err := io.ReadAll(resp.Body) + if err != nil { + return &RequestError{ HTTPStatusCode: resp.StatusCode, Err: err, } - if errRes.Error != nil { - reqErr.Err = errRes.Error - } - return reqErr } - errRes.Error.HTTPStatusCode = resp.StatusCode - return errRes.Error + // Decode into ErrorResponse + // First attempt to decode into ErrorResponse + err = json.Unmarshal(bodyBytes, &errResp) + if err == nil && errResp.Error != nil { + errResp.Error.HTTPStatusCode = resp.StatusCode + return errResp.Error + } + + // If the first decode didn't work or resulted in an empty Error, try CompatibleErrorResponse + err = json.Unmarshal(bodyBytes, &compErrResp) + if err == nil && compErrResp.APIError != nil { + compErrResp.HTTPStatusCode = resp.StatusCode + return compErrResp.APIError + } + + return &RequestError{ + HTTPStatusCode: resp.StatusCode, + Err: err, + } } func containsSubstr(s []string, e string) bool { diff --git a/error.go b/error.go index 37959a272..c498c18d2 100644 --- a/error.go +++ b/error.go @@ -33,6 +33,10 @@ type ErrorResponse struct { Error *APIError `json:"error,omitempty"` } +type CompatibleErrorResponse struct { + *APIError +} + func (e *APIError) Error() string { if e.HTTPStatusCode > 0 { return fmt.Sprintf("error, status code: %d, message: %s", e.HTTPStatusCode, e.Message)