diff --git a/staging/src/k8s.io/client-go/rest/request.go b/staging/src/k8s.io/client-go/rest/request.go index 25f3a059b36..dfe5e0addce 100644 --- a/staging/src/k8s.io/client-go/rest/request.go +++ b/staging/src/k8s.io/client-go/rest/request.go @@ -752,8 +752,9 @@ func (r *Request) Watch(ctx context.Context) (watch.Interface, error) { // the server must have sent us an error in 'err' return true, nil } - if result := r.transformResponse(resp, req); result.err != nil { - return true, result.err + result := r.transformResponse(resp, req) + if err := result.Error(); err != nil { + return true, err } return true, fmt.Errorf("for request %s, got status: %v", url, resp.StatusCode) }() diff --git a/staging/src/k8s.io/client-go/rest/request_test.go b/staging/src/k8s.io/client-go/rest/request_test.go index 747de7cb5da..38c95c99f49 100644 --- a/staging/src/k8s.io/client-go/rest/request_test.go +++ b/staging/src/k8s.io/client-go/rest/request_test.go @@ -977,7 +977,7 @@ func TestRequestWatch(t *testing.T) { Err: true, }, { - name: "server returns forbidden", + name: "server returns forbidden with json content", Request: &Request{ c: &RESTClient{ content: defaultContentConfig(), @@ -986,41 +986,27 @@ func TestRequestWatch(t *testing.T) { }, serverReturns: []responseErr{ {response: &http.Response{ + Header: http.Header{"Content-Type": []string{"application/json"}}, StatusCode: http.StatusForbidden, - Body: io.NopCloser(bytes.NewReader([]byte{})), + Body: io.NopCloser(bytes.NewReader([]byte(runtime.EncodeOrDie(scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), &metav1.Status{ + Status: metav1.StatusFailure, + Message: "secrets is forbidden", + Reason: metav1.StatusReasonForbidden, + Code: http.StatusForbidden, + })))), }, err: nil}, }, attemptsExpected: 1, - Expect: []watch.Event{ - { - Type: watch.Error, - Object: &metav1.Status{ - Status: "Failure", - Code: 500, - Reason: "InternalError", - Message: `an error on the server ("unable to decode an event from the watch stream: test error") has prevented the request from succeeding`, - Details: &metav1.StatusDetails{ - Causes: []metav1.StatusCause{ - { - Type: "UnexpectedServerResponse", - Message: "unable to decode an event from the watch stream: test error", - }, - { - Type: "ClientWatchDecoding", - Message: "unable to decode an event from the watch stream: test error", - }, - }, - }, - }, - }, - }, - Err: true, + Err: true, ErrFn: func(err error) bool { + if err.Error() != "secrets is forbidden" { + return false + } return apierrors.IsForbidden(err) }, }, { - name: "server returns forbidden", + name: "server returns forbidden without content", Request: &Request{ c: &RESTClient{ content: defaultContentConfig(),