| 284 | |
| 285 | @staticmethod |
| 286 | def _extract_error_response(exception): |
| 287 | if not isinstance(exception, ClientError): |
| 288 | return None |
| 289 | |
| 290 | if hasattr(exception, 'response') and 'Error' in exception.response: |
| 291 | error_dict = dict(exception.response['Error']) |
| 292 | |
| 293 | modeled_fields = exception.modeled_fields |
| 294 | if modeled_fields is not None: |
| 295 | modeled_lower = {f.lower() for f in modeled_fields} |
| 296 | else: |
| 297 | modeled_lower = {'code', 'message'} |
| 298 | |
| 299 | # Only include fields present in the error shape model. |
| 300 | excluded_keys = {'Error', 'ResponseMetadata', 'Code', 'Message'} |
| 301 | for key, value in exception.response.items(): |
| 302 | if key not in excluded_keys and key not in error_dict: |
| 303 | if key.lower() in modeled_lower: |
| 304 | error_dict[key] = value |
| 305 | |
| 306 | # Unmodeled fields can contain data that shouldn't be displayed. |
| 307 | for key in list(error_dict.keys()): |
| 308 | if key.lower() not in modeled_lower: |
| 309 | del error_dict[key] |
| 310 | |
| 311 | return {'Error': error_dict} |
| 312 | |
| 313 | return None |
| 314 | |
| 315 | |
| 316 | class ConfigurationErrorHandler(FilteredExceptionHandler): |