6bb385f2 |
## Amazon S3 manager - Exceptions library
## Author: Michal Ludvig <michal@logix.cz>
## http://www.logix.cz/michal
## License: GPL Version 2 |
afd51b6c |
## Copyright: TGRMN Software and contributors |
6bb385f2 |
|
b3488bab |
from Utils import getTreeFromXml, unicodise, deunicodise |
6bb385f2 |
from logging import debug, info, warning, error
try: |
d439efb4 |
import xml.etree.ElementTree as ET |
6bb385f2 |
except ImportError: |
d439efb4 |
import elementtree.ElementTree as ET |
6bb385f2 |
|
d90a7929 |
class S3Exception(Exception): |
d439efb4 |
def __init__(self, message = ""):
self.message = unicodise(message) |
65b813e3 |
|
d439efb4 |
def __str__(self):
## Call unicode(self) instead of self.message because
## __unicode__() method could be overriden in subclasses!
return deunicodise(unicode(self)) |
d90a7929 |
|
d439efb4 |
def __unicode__(self):
return self.message |
d90a7929 |
|
d439efb4 |
## (Base)Exception.message has been deprecated in Python 2.6
def _get_message(self):
return self._message
def _set_message(self, message):
self._message = message
message = property(_get_message, _set_message) |
d5ff1038 |
|
d90a7929 |
class S3Error (S3Exception): |
d439efb4 |
def __init__(self, response):
self.status = response["status"]
self.reason = response["reason"]
self.info = {
"Code" : "",
"Message" : "",
"Resource" : ""
}
debug("S3Error: %s (%s)" % (self.status, self.reason))
if response.has_key("headers"):
for header in response["headers"]:
debug("HttpHeader: %s: %s" % (header, response["headers"][header])) |
a845140f |
if response.has_key("data") and response["data"]: |
dd58f170 |
try:
tree = getTreeFromXml(response["data"])
except ET.ParseError:
debug("Not an XML response")
else:
self.info.update(self.parse_error_xml(tree))
|
d439efb4 |
self.code = self.info["Code"]
self.message = self.info["Message"]
self.resource = self.info["Resource"]
def __unicode__(self):
retval = u"%d " % (self.status)
retval += (u"(%s)" % (self.info.has_key("Code") and self.info["Code"] or self.reason))
if self.info.has_key("Message"):
retval += (u": %s" % self.info["Message"])
return retval |
6bb385f2 |
|
dd58f170 |
@staticmethod
def parse_error_xml(tree):
info = {}
error_node = tree
if not error_node.tag == "Error":
error_node = tree.find(".//Error")
for child in error_node.getchildren():
if child.text != "":
debug("ErrorXML: " + child.tag + ": " + repr(child.text))
info[child.tag] = child.text
return info
|
b3488bab |
class CloudFrontError(S3Error): |
d439efb4 |
pass
|
d90a7929 |
class S3UploadError(S3Exception): |
d439efb4 |
pass |
6bb385f2 |
|
d90a7929 |
class S3DownloadError(S3Exception): |
d439efb4 |
pass |
ed27a45e |
|
00f5f67e |
class S3RequestError(S3Exception): |
d439efb4 |
pass |
00f5f67e |
|
cde72d48 |
class S3ResponseError(S3Exception): |
d439efb4 |
pass |
cde72d48 |
|
451a19a2 |
class InvalidFileError(S3Exception): |
d439efb4 |
pass |
451a19a2 |
|
d90a7929 |
class ParameterError(S3Exception): |
d439efb4 |
pass
# vim:et:ts=4:sts=4:ai |