Cleanup headers and encoding.
This commit is contained in:
parent
468a1b970c
commit
cad185c74d
19 changed files with 138 additions and 101 deletions
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue