Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion errors_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -252,9 +252,12 @@ func TestBuildAPIError_UnparseableBodyPath(t *testing.T) {
if got.Code != 0 {
t.Errorf("Code = %d, want 0 for unparseable", got.Code)
}
if got.Message != "failed to parse error response" {
if got.Message != "failed to parse error response: unexpected server response code 500" {
t.Errorf("Message = %q, want canonical unparseable text", got.Message)
}
if got.StatusCode != http.StatusInternalServerError {
t.Errorf("StatusCode = %d, want the transport status preserved", got.StatusCode)
}
if got.RawResponseBody != body {
t.Errorf("RawResponseBody = %q, want raw body preserved", got.RawResponseBody)
}
Expand Down
5 changes: 4 additions & 1 deletion http.go
Original file line number Diff line number Diff line change
Expand Up @@ -131,8 +131,11 @@ func buildAPIError(resp *http.Response, body []byte) *StreamError {

if len(body) > 0 {
if err := json.Unmarshal(body, apiErr); err != nil {
// A failed Unmarshal can still have assigned fields before it errored,
// so restore the transport status rather than trust the partial parse.
apiErr.StatusCode = resp.StatusCode
apiErr.Code = 0
apiErr.Message = "failed to parse error response"
apiErr.Message = fmt.Sprintf("failed to parse error response: unexpected server response code %d", resp.StatusCode)
apiErr.ExceptionFields = map[string]string{}
apiErr.Unrecoverable = false
apiErr.cause = stackWrap(err, "parse api error response")
Expand Down
Loading