Cleanup headers and encoding.

This commit is contained in:
Steve Pulec 2017-02-16 22:51:04 -05:00
commit cad185c74d
19 changed files with 138 additions and 101 deletions

View file

@ -8,7 +8,11 @@ import re
from moto.packages.responses import responses
from moto.packages.httpretty import HTTPretty
from .responses import metadata_response
from .utils import convert_regex_to_flask_path, convert_flask_to_responses_response
from .utils import (
convert_httpretty_response,
convert_regex_to_flask_path,
convert_flask_to_responses_response,
)
class BaseMockAWS(object):
nested_count = 0
@ -93,14 +97,14 @@ class HttprettyMockAWS(BaseMockAWS):
HTTPretty.register_uri(
method=method,
uri=re.compile(key),
body=value,
body=convert_httpretty_response(value),
)
# Mock out localhost instance metadata
HTTPretty.register_uri(
method=method,
uri=re.compile('http://169.254.169.254/latest/meta-data/.*'),
body=metadata_response
body=convert_httpretty_response(metadata_response),
)
def disable_patching(self):

View file

@ -123,14 +123,14 @@ class BaseResponse(_TemplateEnvironmentMixin):
for key, value in request.form.items():
querystring[key] = [value, ]
if isinstance(self.body, six.binary_type):
self.body = self.body.decode('utf-8')
if not querystring:
querystring.update(parse_qs(urlparse(full_url).query, keep_blank_values=True))
if not querystring:
if 'json' in request.headers.get('content-type', []) and self.aws_service_spec:
if isinstance(self.body, six.binary_type):
decoded = json.loads(self.body.decode('utf-8'))
else:
decoded = json.loads(self.body)
decoded = json.loads(self.body)
target = request.headers.get('x-amz-target') or request.headers.get('X-Amz-Target')
service, method = target.split('.')
@ -154,7 +154,7 @@ class BaseResponse(_TemplateEnvironmentMixin):
self.headers = request.headers
if 'host' not in self.headers:
self.headers['host'] = urlparse(full_url).netloc
self.response_headers = headers
self.response_headers = {"server": "amazon.com"}
def get_region_from_url(self, full_url):
match = re.search(self.region_regex, full_url)

View file

@ -79,6 +79,29 @@ def convert_regex_to_flask_path(url_path):
return url_path
class convert_httpretty_response(object):
def __init__(self, callback):
self.callback = callback
@property
def __name__(self):
# For instance methods, use class and method names. Otherwise
# use module and method name
if inspect.ismethod(self.callback):
outer = self.callback.__self__.__class__.__name__
else:
outer = self.callback.__module__
return "{0}.{1}".format(outer, self.callback.__name__)
def __call__(self, request, url, headers, **kwargs):
result = self.callback(request, url, headers)
status, headers, response = result
if 'server' not in headers:
headers["server"] = "amazon.com"
return status, headers, response
class convert_flask_to_httpretty_response(object):
def __init__(self, callback):
@ -119,8 +142,11 @@ class convert_flask_to_responses_response(object):
return "{0}.{1}".format(outer, self.callback.__name__)
def __call__(self, request, *args, **kwargs):
for key, val in request.headers.items():
if isinstance(val, six.binary_type):
request.headers[key] = val.decode("utf-8")
result = self.callback(request, request.url, request.headers)
# result is a status, headers, response tuple
status, headers, response = result
return status, headers, response