summaryrefslogtreecommitdiff
path: root/boto/auth.py
diff options
context:
space:
mode:
authorDaniel Lindsley <daniel@toastdriven.com>2013-12-10 22:05:22 -0800
committerDaniel Lindsley <daniel@toastdriven.com>2013-12-10 22:05:22 -0800
commit66bcb1d4bc18d4c45b4ccd37e87ed3edbc74ffda (patch)
treed0ae42e855e494fc57ddc4349bc1237186bf0394 /boto/auth.py
parentb905f652c9728bb437959ebfb83dcae82bf16e36 (diff)
downloadboto-66bcb1d4bc18d4c45b4ccd37e87ed3edbc74ffda.tar.gz
S3 domains are a wee bit non-standard between regions.
Just a bit.
Diffstat (limited to 'boto/auth.py')
-rw-r--r--boto/auth.py56
1 files changed, 36 insertions, 20 deletions
diff --git a/boto/auth.py b/boto/auth.py
index 2b4428c2..8ea3ae40 100644
--- a/boto/auth.py
+++ b/boto/auth.py
@@ -583,34 +583,50 @@ class S3HmacAuthV4Handler(HmacAuthV4Handler, AuthHandler):
return headers_to_sign
def determine_region_name(self, host):
- # S3's different format of representing region/service from the rest of
- # AWS makes this hurt too.
+ # S3's different format(s) of representing region/service from the
+ # rest of AWS makes this hurt too.
+ #
+ # Possible domain formats:
+ # - s3.amazonaws.com (Classic)
+ # - s3-us-west-2.amazonaws.com (Specific region)
+ # - bukkit.s3.amazonaws.com (Vhosted Classic)
+ # - bukkit.s3-ap-northeast-1.amazonaws.com (Vhosted specific region)
+ # - s3.cn-north-1.amazonaws.com.cn - (Bejing region)
+ # - bukkit.s3.cn-north-1.amazonaws.com.cn - (Vhosted Bejing region)
parts = self.split_host_parts(host)
+
if self.region_name is not None:
region_name = self.region_name
else:
+ # Classic URLs - s3-us-west-2.amazonaws.com
if len(parts) == 3:
- region_name = parts[0]
+ region_name = self.clean_region_name(parts[0])
+
+ # Special-case for Classic.
+ if region_name == 's3':
+ region_name = 'us-east-1'
else:
- region_name = parts[1]
- cleaned = self.clean_region_name(region_name)
- if cleaned == 's3':
- return 'us-east-1'
- return cleaned
+ # Iterate over the parts in reverse order.
+ for offset, part in enumerate(reversed(parts)):
+ part = part.lower()
+
+ # Look for the first thing starting with 's3'.
+ # Until there's a ``.s3`` TLD, we should be OK. :P
+ if part == 's3':
+ # If it's by itself, the region is the previous part.
+ region_name = parts[-offset]
+ break
+ elif part.startswith('s3-'):
+ region_name = self.clean_region_name(part)
+ break
+
+ return region_name
def determine_service_name(self, host):
- parts = self.split_host_parts(host)
- if self.service_name is not None:
- service_name = self.service_name
- else:
- # Virtual hosting of buckets + non-standard region names make this
- # part of the code hurt.
- if parts[-3].startswith('s3-'):
- service_name = 's3'
- else:
- service_name = parts[-4]
- service_name = 's3'
- return service_name
+ # Should this signing mechanism ever be used for anything else, this
+ # will fail. Consider utilizing the logic from the parent class should
+ # you find yourself here.
+ return 's3'
def mangle_path_and_params(self, req):
"""