Adding server mode

This commit is contained in:
Steve Pulec 2013-03-05 08:14:43 -05:00
commit a728b2581a
31 changed files with 489 additions and 66 deletions

View file

@ -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()

View file

@ -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':

View file

@ -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,
}

View file

@ -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