S3/Exceptions.py
6bb385f2
 ## Amazon S3 manager - Exceptions library
 ## Author: Michal Ludvig <michal@logix.cz>
 ##         http://www.logix.cz/michal
 ## License: GPL Version 2
 
b3488bab
 from Utils import getTreeFromXml, unicodise, deunicodise
6bb385f2
 from logging import debug, info, warning, error
 
 try:
 	import xml.etree.ElementTree as ET
 except ImportError:
 	import elementtree.ElementTree as ET
 
d90a7929
 class S3Exception(Exception):
65b813e3
 	def __init__(self, message = ""):
82d9eafa
 		self.message = unicodise(message)
65b813e3
 
d90a7929
 	def __str__(self):
114b1b80
 		## Call unicode(self) instead of self.message because
 		## __unicode__() method could be overriden in subclasses!
 		return deunicodise(unicode(self))
d90a7929
 
 	def __unicode__(self):
 		return self.message
 
d5ff1038
 	## (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)
 
 
d90a7929
 class S3Error (S3Exception):
6bb385f2
 	def __init__(self, response):
 		self.status = response["status"]
 		self.reason = response["reason"]
46631fce
 		self.info = {
 			"Code" : "",
 			"Message" : "",
 			"Resource" : ""
 		}
6bb385f2
 		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]))
b3488bab
 		if response.has_key("data"):
 			tree = getTreeFromXml(response["data"])
 			error_node = tree
 			if not error_node.tag == "Error":
 				error_node = tree.find(".//Error")
 			for child in error_node.getchildren():
6bb385f2
 				if child.text != "":
 					debug("ErrorXML: " + child.tag + ": " + repr(child.text))
 					self.info[child.tag] = child.text
46631fce
 		self.code = self.info["Code"]
 		self.message = self.info["Message"]
 		self.resource = self.info["Resource"]
6bb385f2
 
d90a7929
 	def __unicode__(self):
b3488bab
 		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"])
6bb385f2
 		return retval
 
b3488bab
 class CloudFrontError(S3Error):
 	pass
 		
d90a7929
 class S3UploadError(S3Exception):
6bb385f2
 	pass
 
d90a7929
 class S3DownloadError(S3Exception):
ed27a45e
 	pass
 
00f5f67e
 class S3RequestError(S3Exception):
 	pass
 
451a19a2
 class InvalidFileError(S3Exception):
 	pass
 
d90a7929
 class ParameterError(S3Exception):
6bb385f2
 	pass