| 70 | |
| 71 | |
| 72 | class S3Error(S3Exception): |
| 73 | def __init__(self, response): |
| 74 | self.status = response["status"] |
| 75 | self.reason = response["reason"] |
| 76 | self.info = { |
| 77 | "Code": "", |
| 78 | "Message": "", |
| 79 | "Resource": "" |
| 80 | } |
| 81 | debug("S3Error: %s (%s)" % (self.status, self.reason)) |
| 82 | if "headers" in response: |
| 83 | for header in response["headers"]: |
| 84 | debug("HttpHeader: %s: %s" % (header, response["headers"][header])) |
| 85 | if "data" in response and response["data"]: |
| 86 | try: |
| 87 | tree = S3.BaseUtils.getTreeFromXml(response["data"]) |
| 88 | except XmlParseError: |
| 89 | debug("Not an XML response") |
| 90 | else: |
| 91 | try: |
| 92 | self.info.update(self.parse_error_xml(tree)) |
| 93 | except Exception as e: |
| 94 | error("Error parsing xml: %s. ErrorXML: %s" % (e, response["data"])) |
| 95 | |
| 96 | self.code = self.info["Code"] |
| 97 | self.message = self.info["Message"] |
| 98 | self.resource = self.info["Resource"] |
| 99 | |
| 100 | def __unicode__(self): |
| 101 | retval = u"%d " % (self.status) |
| 102 | retval += (u"(%s)" % (self.code or self.reason)) |
| 103 | error_msg = self.message |
| 104 | if error_msg: |
| 105 | retval += (u": %s" % error_msg) |
| 106 | return retval |
| 107 | |
| 108 | def get_error_code(self): |
| 109 | if self.status in [301, 307]: |
| 110 | return ExitCodes.EX_SERVERMOVED |
| 111 | elif self.status in [400, 405, 411, 416, 417, 501, 504]: |
| 112 | return ExitCodes.EX_SERVERERROR |
| 113 | elif self.status == 403: |
| 114 | return ExitCodes.EX_ACCESSDENIED |
| 115 | elif self.status == 404: |
| 116 | return ExitCodes.EX_NOTFOUND |
| 117 | elif self.status == 409: |
| 118 | return ExitCodes.EX_CONFLICT |
| 119 | elif self.status == 412: |
| 120 | return ExitCodes.EX_PRECONDITION |
| 121 | elif self.status == 500: |
| 122 | return ExitCodes.EX_SOFTWARE |
| 123 | elif self.status in [429, 503]: |
| 124 | return ExitCodes.EX_SERVICE |
| 125 | else: |
| 126 | return ExitCodes.EX_SOFTWARE |
| 127 | |
| 128 | @staticmethod |
| 129 | def parse_error_xml(tree): |
no outgoing calls
no test coverage detected
searching dependent graphs…