From ce7695b9971fd3238da7bc6bc8ceaa2ae109a32e Mon Sep 17 00:00:00 2001 From: "Jeevanandam M." Date: Sat, 21 Sep 2024 14:06:16 -0700 Subject: [PATCH] fix: do not use errors.Join, just use custom error approach (#863) --- client.go | 12 +++++++----- util.go | 26 ++++++++++++++++++++++++++ util_test.go | 16 ++++++++++++++++ 3 files changed, 49 insertions(+), 5 deletions(-) diff --git a/client.go b/client.go index a40bbe4b..87a88da2 100644 --- a/client.go +++ b/client.go @@ -1243,12 +1243,14 @@ func (c *Client) execute(req *Request) (*Response, error) { } if err != nil || req.notParseResponse || c.notParseResponse { - logErr := responseLogger(c, response) response.setReceivedAt() + if logErr := responseLogger(c, response); logErr != nil { + return response, wrapErrors(logErr, err) + } if err != nil { - return response, errors.Join(err, logErr) + return response, err } - return response, wrapNoRetryErr(logErr) + return response, nil } if !req.isSaveResponse { @@ -1260,7 +1262,7 @@ func (c *Client) execute(req *Request) (*Response, error) { if _, ok := body.(*gzip.Reader); !ok { body, err = gzip.NewReader(body) if err != nil { - err = errors.Join(err, responseLogger(c, response)) + err = wrapErrors(responseLogger(c, response), err) response.setReceivedAt() return response, err } @@ -1269,7 +1271,7 @@ func (c *Client) execute(req *Request) (*Response, error) { } if response.body, err = readAllWithLimit(body, req.responseBodyLimit); err != nil { - err = errors.Join(err, responseLogger(c, response)) + err = wrapErrors(responseLogger(c, response), err) response.setReceivedAt() return response, err } diff --git a/util.go b/util.go index 812dce3d..e1a66ffe 100644 --- a/util.go +++ b/util.go @@ -357,6 +357,32 @@ func copyHeaders(hdrs http.Header) http.Header { return nh } +func wrapErrors(n error, inner error) error { + if inner == nil { + return n + } + if n == nil { + return inner + } + return &restyError{ + err: n, + inner: inner, + } +} + +type restyError struct { + err error + inner error +} + +func (e *restyError) Error() string { + return e.err.Error() +} + +func (e *restyError) Unwrap() error { + return e.inner +} + type noRetryErr struct { err error } diff --git a/util_test.go b/util_test.go index 6c030fd7..4d0a888d 100644 --- a/util_test.go +++ b/util_test.go @@ -6,6 +6,7 @@ package resty import ( "bytes" + "errors" "mime/multipart" "testing" ) @@ -89,3 +90,18 @@ func TestWriteMultipartFormFileReaderError(t *testing.T) { assertNotNil(t, err) assertEqual(t, "read error", err.Error()) } + +func TestRestyErrorFuncs(t *testing.T) { + ne1 := errors.New("new error 1") + nie1 := errors.New("inner error 1") + + e := wrapErrors(ne1, nie1) + assertEqual(t, "new error 1", e.Error()) + assertEqual(t, "inner error 1", errors.Unwrap(e).Error()) + + e = wrapErrors(ne1, nil) + assertEqual(t, "new error 1", e.Error()) + + e = wrapErrors(nil, nie1) + assertEqual(t, "inner error 1", e.Error()) +}