diff --git a/moto/s3/responses.py b/moto/s3/responses.py index 18698c275..cec2de6d9 100644 --- a/moto/s3/responses.py +++ b/moto/s3/responses.py @@ -40,11 +40,13 @@ class ResponseObject(_TemplateEnvironmentMixin): return template.render(buckets=all_buckets) def subdomain_based_buckets(self, request): - host = request.headers['host'] + host = request.headers.get('host', request.headers.get('Host')) if host.startswith("localhost"): # For localhost, default to path-based buckets return False - return host != 's3.amazonaws.com' and not re.match("s3.(.*).amazonaws.com", host) + + path_based = (host == 's3.amazonaws.com' or re.match("s3.(.*).amazonaws.com", host)) + return not path_based def is_delete_keys(self, request, path, bucket_name): if self.subdomain_based_buckets(request): diff --git a/moto/s3/urls.py b/moto/s3/urls.py index dda4b273a..6d9ff514e 100644 --- a/moto/s3/urls.py +++ b/moto/s3/urls.py @@ -1,4 +1,6 @@ from __future__ import unicode_literals + +from moto.compat import OrderedDict from .responses import S3ResponseInstance url_bases = [ @@ -6,13 +8,13 @@ url_bases = [ "https?://(?P[a-zA-Z0-9\-_.]*)\.?s3(.*).amazonaws.com" ] -url_paths = { +url_paths = OrderedDict([ # subdomain bucket - '{0}/$': S3ResponseInstance.bucket_response, + ('{0}/$', S3ResponseInstance.bucket_response), # subdomain key of path-based bucket - '{0}/(?P.+)': S3ResponseInstance.ambiguous_response, + ('{0}/(?P.+)', S3ResponseInstance.ambiguous_response), # path-based bucket + key - '{0}/(?P[a-zA-Z0-9\-_./]+)/(?P.+)': S3ResponseInstance.key_response, -} + ('{0}/(?P[a-zA-Z0-9\-_./]+)/(?P.+)', S3ResponseInstance.key_response), +])