diff --git a/CHANGELOG_PENDING.md b/CHANGELOG_PENDING.md index 8a1927a39ca..e1077f04375 100644 --- a/CHANGELOG_PENDING.md +++ b/CHANGELOG_PENDING.md @@ -3,3 +3,5 @@ ### SDK Enhancements ### SDK Bugs + +- `private/protocol`: Use request body error message for unknown errors missing a message header diff --git a/private/protocol/restjson/unmarshal_error.go b/private/protocol/restjson/unmarshal_error.go index d756d8cc529..4fffd0427ba 100644 --- a/private/protocol/restjson/unmarshal_error.go +++ b/private/protocol/restjson/unmarshal_error.go @@ -45,7 +45,7 @@ func (u *UnmarshalTypedError) UnmarshalError( msg := resp.Header.Get(errorMessageHeader) body := resp.Body - if len(code) == 0 { + if len(code) == 0 || len(msg) == 0 { // If unable to get code from HTTP headers have to parse JSON message // to determine what kind of exception this will be. var buf bytes.Buffer @@ -57,7 +57,9 @@ func (u *UnmarshalTypedError) UnmarshalError( } body = ioutil.NopCloser(&buf) - code = jsonErr.Code + if len(code) == 0 { + code = jsonErr.Code + } msg = jsonErr.Message } diff --git a/private/protocol/restjson/unmarshal_error_test.go b/private/protocol/restjson/unmarshal_error_test.go index 97c43b7054b..9f1fbdc8895 100644 --- a/private/protocol/restjson/unmarshal_error_test.go +++ b/private/protocol/restjson/unmarshal_error_test.go @@ -161,6 +161,32 @@ func TestUnmarshalTypedError(t *testing.T) { respMeta.RequestID, ), }, + "unknown code header only": { + Response: &http.Response{ + Header: http.Header{ + errorTypeHeader: []string{"UnknownError"}, + }, + Body: ioutil.NopCloser(strings.NewReader(unknownErrJSON)), + }, + Expect: awserr.NewRequestFailure( + awserr.New("UnknownError", "error message", nil), + respMeta.StatusCode, + respMeta.RequestID, + ), + }, + "unknown message header only": { + Response: &http.Response{ + Header: http.Header{ + errorMessageHeader: []string{"overwritten error message"}, + }, + Body: ioutil.NopCloser(strings.NewReader(unknownErrJSON)), + }, + Expect: awserr.NewRequestFailure( + awserr.New("UnknownError", "error message", nil), + respMeta.StatusCode, + respMeta.RequestID, + ), + }, "code from header": { Response: &http.Response{ Header: http.Header{