Skip to content

Commit ac8a7e8

Browse files
authored
fix: [CLI-888] allowing populated response in RoundTrip error cases (#347)
2 parents 65a591a + 0992f5e commit ac8a7e8

File tree

2 files changed

+53
-11
lines changed

2 files changed

+53
-11
lines changed

pkg/networking/middleware/response.go

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ func NewReponseMiddleware(roundTriper http.RoundTripper, config configuration.Co
3131

3232
func (rm ResponseMiddleware) RoundTrip(req *http.Request) (*http.Response, error) {
3333
res, err := rm.next.RoundTrip(req)
34-
3534
if err != nil {
3635
return res, err
3736
}
@@ -40,15 +39,10 @@ func (rm ResponseMiddleware) RoundTrip(req *http.Request) (*http.Response, error
4039

4140
err = rm.errHandler(err, res.Request.Context())
4241

43-
// RoundTrip should return one or the other.
44-
if err != nil {
45-
res = nil
46-
}
47-
4842
return res, err
4943
}
5044

51-
// HandleResponse maps the response param to the eror catalog error.
45+
// HandleResponse maps the response param to the error catalog error.
5246
func HandleResponse(res *http.Response, config configuration.Configuration) error {
5347
if res == nil {
5448
return nil
@@ -80,6 +74,7 @@ func getErrorList(res *http.Response) []snyk_errors.Error {
8074
if err != nil {
8175
return []snyk_errors.Error{}
8276
}
77+
8378
res.Body = io.NopCloser(bytes.NewBuffer(bodyBytes))
8479

8580
errorList, err := snyk_errors.FromJSONAPIErrorBytes(bodyBytes)

pkg/networking/middleware/response_test.go

Lines changed: 51 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package middleware_test
33
import (
44
"context"
55
"fmt"
6+
"io"
67
"net/http"
78
"net/http/httptest"
89
"testing"
@@ -46,6 +47,8 @@ func Test_ResponseMiddleware(t *testing.T) {
4647
assert.Nil(t, err)
4748
default:
4849
w.WriteHeader(http.StatusOK)
50+
_, err := w.Write([]byte("hello"))
51+
assert.Nil(t, err)
4952
}
5053
})
5154
server := httptest.NewServer(handler)
@@ -77,7 +80,7 @@ func Test_ResponseMiddleware(t *testing.T) {
7780
req := buildRequest(url)
7881
res, err := rt.RoundTrip(req)
7982

80-
assert.Nil(t, res)
83+
assert.NotNil(t, res)
8184
assert.ErrorAs(t, err, &snykErr)
8285
assert.Equal(t, code, snykErr.StatusCode)
8386

@@ -121,7 +124,7 @@ func Test_ResponseMiddleware(t *testing.T) {
121124
req := buildRequest(server.URL + "/jsonapi-SNYK-0003")
122125
res, err := rt.RoundTrip(req)
123126

124-
assert.Nil(t, res)
127+
assert.NotNil(t, res)
125128
assert.Error(t, err)
126129

127130
actual := snyk_errors.Error{}
@@ -138,7 +141,7 @@ func Test_ResponseMiddleware(t *testing.T) {
138141
req := buildRequest(server.URL + "/jsonapi-SNYK-0000")
139142
res, err := rt.RoundTrip(req)
140143

141-
assert.Nil(t, res)
144+
assert.NotNil(t, res)
142145
assert.Error(t, err)
143146

144147
actual := snyk_errors.Error{}
@@ -155,7 +158,7 @@ func Test_ResponseMiddleware(t *testing.T) {
155158
req := buildRequest(server.URL + "/error-catalog")
156159
res, err := rt.RoundTrip(req)
157160

158-
assert.Nil(t, res)
161+
assert.NotNil(t, res)
159162
assert.Error(t, err)
160163

161164
expected := snyk.NewBadGatewayError("")
@@ -204,6 +207,50 @@ func Test_ResponseMiddleware(t *testing.T) {
204207
assert.NoError(t, err)
205208
assert.Equal(t, http.StatusOK, res.StatusCode)
206209
})
210+
211+
t.Run("response body should be consumable after roundtrip", func(t *testing.T) {
212+
testCases := []struct {
213+
name string
214+
urlPath string
215+
expectError bool
216+
}{
217+
{
218+
name: "no error",
219+
urlPath: "",
220+
expectError: false,
221+
},
222+
{
223+
name: "with error",
224+
urlPath: "/error-catalog",
225+
expectError: true,
226+
},
227+
}
228+
229+
for _, tc := range testCases {
230+
t.Run(tc.name, func(t *testing.T) {
231+
config := getBaseConfig()
232+
config.Set(configuration.AUTHENTICATION_ADDITIONAL_URLS, []string{server.URL})
233+
234+
rt := middleware.NewReponseMiddleware(http.DefaultTransport, config, errHandler)
235+
req := buildRequest(server.URL + tc.urlPath)
236+
res, err := rt.RoundTrip(req)
237+
238+
assert.NotNil(t, res)
239+
if tc.expectError {
240+
assert.Error(t, err)
241+
} else {
242+
assert.NoError(t, err)
243+
}
244+
245+
bodyBytes, err := io.ReadAll(res.Body)
246+
assert.NoError(t, err, "Body should be readable")
247+
assert.NotEmpty(t, bodyBytes, "Should be able to read body")
248+
249+
err = res.Body.Close()
250+
assert.NoError(t, err, "Body should close without errors")
251+
})
252+
}
253+
})
207254
}
208255

209256
func buildRequest(url string) *http.Request {

0 commit comments

Comments
 (0)