git-svn-id: https://s3tools.svn.sourceforge.net/svnroot/s3tools/s3cmd/trunk@406 830e0280-6d2a-0410-9c65-932aecc39d9d
| ... | ... |
@@ -35,7 +35,11 @@ class S3Error (S3Exception): |
| 35 | 35 |
def __init__(self, response): |
| 36 | 36 |
self.status = response["status"] |
| 37 | 37 |
self.reason = response["reason"] |
| 38 |
- self.info = {}
|
|
| 38 |
+ self.info = {
|
|
| 39 |
+ "Code" : "", |
|
| 40 |
+ "Message" : "", |
|
| 41 |
+ "Resource" : "" |
|
| 42 |
+ } |
|
| 39 | 43 |
debug("S3Error: %s (%s)" % (self.status, self.reason))
|
| 40 | 44 |
if response.has_key("headers"):
|
| 41 | 45 |
for header in response["headers"]: |
| ... | ... |
@@ -49,6 +53,9 @@ class S3Error (S3Exception): |
| 49 | 49 |
if child.text != "": |
| 50 | 50 |
debug("ErrorXML: " + child.tag + ": " + repr(child.text))
|
| 51 | 51 |
self.info[child.tag] = child.text |
| 52 |
+ self.code = self.info["Code"] |
|
| 53 |
+ self.message = self.info["Message"] |
|
| 54 |
+ self.resource = self.info["Resource"] |
|
| 52 | 55 |
|
| 53 | 56 |
def __unicode__(self): |
| 54 | 57 |
retval = u"%d " % (self.status) |
| ... | ... |
@@ -580,8 +580,17 @@ class S3(object): |
| 580 | 580 |
response['headers']['etag'] = '' |
| 581 | 581 |
|
| 582 | 582 |
if response["status"] < 200 or response["status"] > 299: |
| 583 |
+ try_retry = False |
|
| 583 | 584 |
if response["status"] >= 500: |
| 584 | 585 |
## AWS internal error - retry |
| 586 |
+ try_retry = True |
|
| 587 |
+ elif response["status"] >= 400: |
|
| 588 |
+ err = S3Error(response) |
|
| 589 |
+ ## Retriable client error? |
|
| 590 |
+ if err.code in [ 'BadDigest', 'OperationAborted', 'TokenRefreshRequired', 'RequestTimeout' ]: |
|
| 591 |
+ try_retry = True |
|
| 592 |
+ |
|
| 593 |
+ if try_retry: |
|
| 585 | 594 |
if retries: |
| 586 | 595 |
warning("Upload failed: %s (%s)" % (resource['uri'], S3Error(response)))
|
| 587 | 596 |
warning("Waiting %d sec..." % self._fail_wait(retries))
|
| ... | ... |
@@ -590,6 +599,7 @@ class S3(object): |
| 590 | 590 |
else: |
| 591 | 591 |
warning("Too many failures. Giving up on '%s'" % (file.name))
|
| 592 | 592 |
raise S3UploadError |
| 593 |
+ |
|
| 593 | 594 |
## Non-recoverable error |
| 594 | 595 |
raise S3Error(response) |
| 595 | 596 |
|