87
}
88
89
>
func (c *baseHTTPClient) failureFromResponse(response *http.Response, body []byte) (nexus.Failure, error) {
client.go
90
>
if !isMediaTypeJSON(response.Header.Get("Content-Type")) {
91
return nexus.Failure{}, newUnexpectedResponseError(fmt.Sprintf("invalid response content type: %q", response.Header.Get("Content-Type")), response, body)
92
}
94
>
err := json.Unmarshal(body, &failure)
95
>
return failure, err
96
}
97
98
>
func (c *baseHTTPClient) defaultErrorFromResponse(response *http.Response, body []byte, cause error) error {
client.go
99
>
errorType, err := httpStatusCodeToHandlerErrorType(response)
100
>
if err != nil {
101
// TODO(bergundy): optimization - use the provided cause, it's already a deserialized failure.
102
return newUnexpectedResponseError(err.Error(), response, body)
103
}
105
>
Type: errorType,
106
>
// For compatibility with older servers.
107
>
RetryBehavior: retryBehaviorFromHeader(response.Header),
108
>
Cause: cause,
109
>
}
110
>
111
>
// Ensure the original failure is available, the calling code expects it.
112
>
originalFailure, err := c.failureConverter.ErrorToFailure(handlerErr)
113
>
if err != nil {
114
return newUnexpectedResponseError("failed to construct handler error from response: "+err.Error(), response, body)
115
}
117
>
return handlerErr
118
}
119
120
// bestEffortHandlerErrorFromResponse attempts to read a handler error from the response, but falls back to an unexpected response error.
121
>
func (c *baseHTTPClient) bestEffortHandlerErrorFromResponse(response *http.Response, body []byte) error {
client.go
122
>
failure, err := c.failureFromResponse(response, body)
123
>
if err != nil {
124
return c.defaultErrorFromResponse(response, body, nil)
125
}
127
>
if err != nil {
128
return newUnexpectedResponseError(fmt.Sprintf("failed to convert Failure to error: %s", err.Error()), response, body)
129
}
132
>
}
134
}
135