Skip to content

Commit

Permalink
Revert "Fix Sqs ErrorType not being parsed properly (boto#3054)"
Browse files Browse the repository at this point in the history
This reverts commit 50861b9, reversing
changes made to 01dabf4.
  • Loading branch information
SamRemis committed Nov 21, 2023
1 parent 9d07df9 commit 23562d9
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 31 deletions.
5 changes: 1 addition & 4 deletions botocore/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -975,10 +975,7 @@ def _make_api_call(self, operation_name, api_params):
)

if http.status_code >= 300:
error_info = parsed_response.get("Error", {})
error_code = error_info.get("QueryErrorCode") or error_info.get(
"Code"
)
error_code = parsed_response.get("Error", {}).get("Code")
error_class = self.exceptions.from_code(error_code)
raise error_class(parsed_response, operation_name)
else:
Expand Down
31 changes: 10 additions & 21 deletions botocore/parsers.py
Original file line number Diff line number Diff line change
Expand Up @@ -701,37 +701,26 @@ def _do_error_parse(self, response, shape):
# if the message did not contain an error code
# include the response status code
response_code = response.get('status_code')

code = body.get('__type', response_code and str(response_code))
# Error response may contain an x-amzn-query-error header for json
# we need to fetch the error code from this header in that case
query_error = headers.get('x-amzn-query-error', '')
query_error_components = query_error.split(';')
code = None
if len(query_error_components) == 2 and query_error_components[0]:
code = query_error_components[0]
error['Error']['Type'] = query_error_components[1]
if code is None:
code = body.get('__type', response_code and str(response_code))
if code is not None:
# code has a couple forms as well:
# * "com.aws.dynamodb.vAPI#ProvisionedThroughputExceededException"
# * "ResourceNotFoundException"
if '#' in code:
code = code.rsplit('#', 1)[1]
if 'x-amzn-query-error' in headers:
code = self._do_query_compatible_error_parse(
code, headers, error
)
error['Error']['Code'] = code
self._inject_response_metadata(error, response['headers'])
return error

def _do_query_compatible_error_parse(self, code, headers, error):
"""
Error response may contain an x-amzn-query-error header to translate
errors codes from former `query` services into `json`. We use this to
do our lookup in the errorfactory for modeled errors.
"""
query_error = headers['x-amzn-query-error']
query_error_components = query_error.split(';')

if len(query_error_components) == 2 and query_error_components[0]:
error['Error']['QueryErrorCode'] = code
error['Error']['Type'] = query_error_components[1]
return query_error_components[0]
return code

def _inject_response_metadata(self, parsed, headers):
if 'x-amzn-requestid' in headers:
parsed.setdefault('ResponseMetadata', {})['RequestId'] = headers[
Expand Down
6 changes: 0 additions & 6 deletions tests/unit/test_parsers.py
Original file line number Diff line number Diff line change
Expand Up @@ -1133,9 +1133,6 @@ def test_response_with_query_error_for_json_protocol(self):
self.assertEqual(
parsed['Error']['Code'], 'AWS.SimpleQueueService.NonExistentQueue'
)
self.assertEqual(
parsed['Error']['QueryErrorCode'], "ValidationException"
)
self.assertEqual(parsed['Error']['Type'], 'Sender')

def test_response_with_invalid_query_error_for_json_protocol(self):
Expand All @@ -1158,7 +1155,6 @@ def test_response_with_invalid_query_error_for_json_protocol(self):
self.assertIn('Error', parsed)
self.assertEqual(parsed['Error']['Message'], 'this is a message')
self.assertEqual(parsed['Error']['Code'], 'ValidationException')
self.assertNotIn('QueryErrorCode', parsed['Error'])
self.assertNotIn('Type', parsed['Error'])

def test_response_with_incomplete_query_error_for_json_protocol(self):
Expand All @@ -1181,7 +1177,6 @@ def test_response_with_incomplete_query_error_for_json_protocol(self):
self.assertIn('Error', parsed)
self.assertEqual(parsed['Error']['Message'], 'this is a message')
self.assertEqual(parsed['Error']['Code'], 'ValidationException')
self.assertNotIn('QueryErrorCode', parsed['Error'])
self.assertNotIn('Type', parsed['Error'])

def test_response_with_empty_query_errors_for_json_protocol(self):
Expand All @@ -1204,7 +1199,6 @@ def test_response_with_empty_query_errors_for_json_protocol(self):
self.assertIn('Error', parsed)
self.assertEqual(parsed['Error']['Message'], 'this is a message')
self.assertEqual(parsed['Error']['Code'], 'ValidationException')
self.assertNotIn('QueryErrorCode', parsed['Error'])
self.assertNotIn('Type', parsed['Error'])

def test_parse_error_response_for_query_protocol(self):
Expand Down

0 comments on commit 23562d9

Please sign in to comment.