Adding server mode
This commit is contained in:
parent
c6f5afff75
commit
a728b2581a
31 changed files with 489 additions and 66 deletions
|
|
@ -61,8 +61,9 @@ class S3Backend(BaseBackend):
|
|||
return new_key
|
||||
|
||||
def get_key(self, bucket_name, key_name):
|
||||
bucket = self.buckets[bucket_name]
|
||||
return bucket.keys.get(key_name)
|
||||
bucket = self.get_bucket(bucket_name)
|
||||
if bucket:
|
||||
return bucket.keys.get(key_name)
|
||||
|
||||
def prefix_query(self, bucket, prefix):
|
||||
key_results = set()
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ from moto.core.utils import headers_to_dict
|
|||
from .utils import bucket_name_from_hostname
|
||||
|
||||
|
||||
def all_buckets(uri, body, method):
|
||||
def all_buckets():
|
||||
# No bucket specified. Listing all buckets
|
||||
all_buckets = s3_backend.get_all_buckets()
|
||||
template = Template(S3_ALL_BUCKETS)
|
||||
|
|
@ -20,6 +20,9 @@ def bucket_response(uri, body, headers):
|
|||
querystring = parse_qs(uri.query)
|
||||
|
||||
bucket_name = bucket_name_from_hostname(hostname)
|
||||
if not bucket_name:
|
||||
# If no bucket specified, list all buckets
|
||||
return all_buckets()
|
||||
|
||||
if method == 'GET':
|
||||
bucket = s3_backend.get_bucket(bucket_name)
|
||||
|
|
@ -27,8 +30,12 @@ def bucket_response(uri, body, headers):
|
|||
prefix = querystring.get('prefix', [None])[0]
|
||||
result_keys, result_folders = s3_backend.prefix_query(bucket, prefix)
|
||||
template = Template(S3_BUCKET_GET_RESPONSE)
|
||||
return template.render(bucket=bucket, prefix=prefix,
|
||||
result_keys=result_keys, result_folders=result_folders)
|
||||
return template.render(
|
||||
bucket=bucket,
|
||||
prefix=prefix,
|
||||
result_keys=result_keys,
|
||||
result_folders=result_folders
|
||||
)
|
||||
else:
|
||||
return "", dict(status=404)
|
||||
elif method == 'PUT':
|
||||
|
|
|
|||
|
|
@ -1,9 +1,10 @@
|
|||
from .responses import all_buckets, bucket_response, key_response
|
||||
from .responses import bucket_response, key_response
|
||||
|
||||
base_url = "https?://(.*).s3.amazonaws.com"
|
||||
url_bases = [
|
||||
"https?://(?P<bucket_name>\w*)\.?s3.amazonaws.com"
|
||||
]
|
||||
|
||||
urls = {
|
||||
'https?://s3.amazonaws.com/$': all_buckets,
|
||||
'{0}/$'.format(base_url): bucket_response,
|
||||
'{}/(.+)'.format(base_url): key_response,
|
||||
url_paths = {
|
||||
'{0}/$': bucket_response,
|
||||
'{0}/(?P<key_name>\w+)': key_response,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,23 @@
|
|||
import re
|
||||
import urlparse
|
||||
|
||||
bucket_name_regex = re.compile("(.+).s3.amazonaws.com")
|
||||
|
||||
|
||||
def bucket_name_from_hostname(hostname):
|
||||
bucket_result = bucket_name_regex.search(hostname)
|
||||
return bucket_result.groups()[0]
|
||||
if 'amazonaws.com' in hostname:
|
||||
bucket_result = bucket_name_regex.search(hostname)
|
||||
if bucket_result:
|
||||
return bucket_result.groups()[0]
|
||||
else:
|
||||
# In server mode. Use left-most part of subdomain for bucket name
|
||||
split_url = urlparse.urlparse(hostname)
|
||||
|
||||
# If 'www' prefixed, strip it.
|
||||
clean_hostname = split_url.netloc.lstrip("www.")
|
||||
|
||||
if '.' in clean_hostname:
|
||||
return clean_hostname.split(".")[0]
|
||||
else:
|
||||
# No subdomain found.
|
||||
return None
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue