diff --git a/README.md b/README.md index 0469afc..08350eb 100644 --- a/README.md +++ b/README.md @@ -4,16 +4,12 @@

Features section describes in detail about Resty capabilities

-

Build Status Code Coverage Go Report Card Release Version GoDoc License Mentioned in Awesome Go

-

-

-

Resty Communication Channels

-

Chat on Gitter - Resty Community Twitter @go_resty

+

Build Status Code Coverage Go Report Card Release Version GoDoc License Mentioned in Awesome Go

## News - * v2.15.0 [released](https://github.com/go-resty/resty/releases/tag/v2.15.0) and tagged on Sep 14, 2024. + * v2.15.2 [released](https://github.com/go-resty/resty/releases/tag/v2.15.2) and tagged on Sep 21, 2024. * v2.0.0 [released](https://github.com/go-resty/resty/releases/tag/v2.0.0) and tagged on Jul 16, 2019. * v1.12.0 [released](https://github.com/go-resty/resty/releases/tag/v1.12.0) and tagged on Feb 27, 2019. * v1.0 released and tagged on Sep 25, 2017. - Resty's first version was released on Sep 15, 2015 then it grew gradually as a very handy and helpful library. Its been a two years since first release. I'm very thankful to Resty users and its [contributors](https://github.com/go-resty/resty/graphs/contributors). @@ -109,7 +105,7 @@ Resty author also published following projects for Go Community. ```bash # Go Modules -require github.com/go-resty/resty/v2 v2.15.0 +require github.com/go-resty/resty/v2 v2.15.2 ``` ## Usage diff --git a/client.go b/client.go index a40bbe4..87a88da 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/request_test.go b/request_test.go index f220939..44bec45 100644 --- a/request_test.go +++ b/request_test.go @@ -1710,6 +1710,43 @@ func TestRequestDoNotParseResponse(t *testing.T) { assertNil(t, resp.RawBody()) } +func TestRequestDoNotParseResponseDebugLog(t *testing.T) { + ts := createGetServer(t) + defer ts.Close() + + t.Run("do not parse response debug log client level", func(t *testing.T) { + c := dc(). + SetDoNotParseResponse(true). + SetDebug(true) + + var lgr bytes.Buffer + c.outputLogTo(&lgr) + + _, err := c.R(). + SetQueryParam("request_no", strconv.FormatInt(time.Now().Unix(), 10)). + Get(ts.URL + "/") + + assertError(t, err) + assertEqual(t, true, strings.Contains(lgr.String(), "***** DO NOT PARSE RESPONSE - Enabled *****")) + }) + + t.Run("do not parse response debug log request level", func(t *testing.T) { + c := dc() + + var lgr bytes.Buffer + c.outputLogTo(&lgr) + + _, err := c.R(). + SetDebug(true). + SetDoNotParseResponse(true). + SetQueryParam("request_no", strconv.FormatInt(time.Now().Unix(), 10)). + Get(ts.URL + "/") + + assertError(t, err) + assertEqual(t, true, strings.Contains(lgr.String(), "***** DO NOT PARSE RESPONSE - Enabled *****")) + }) +} + type noCtTest struct { Response string `json:"response"` } diff --git a/response.go b/response.go index c3e4611..f52b5c6 100644 --- a/response.go +++ b/response.go @@ -171,6 +171,9 @@ func (r *Response) setReceivedAt() { } func (r *Response) fmtBodyString(sl int64) string { + if r.Request.client.notParseResponse || r.Request.notParseResponse { + return "***** DO NOT PARSE RESPONSE - Enabled *****" + } if len(r.body) > 0 { if int64(len(r.body)) > sl { return fmt.Sprintf("***** RESPONSE TOO LARGE (size - %d) *****", len(r.body)) diff --git a/resty.go b/resty.go index 1e4dadf..32b84f2 100644 --- a/resty.go +++ b/resty.go @@ -14,7 +14,7 @@ import ( ) // Version # of resty -const Version = "2.15.0" +const Version = "2.15.2" // New method creates a new Resty client. func New() *Client { diff --git a/util.go b/util.go index 812dce3..e1a66ff 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 6c030fd..4d0a888 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()) +}