diff --git a/moto/s3/responses.py b/moto/s3/responses.py index aa5180abf..8e56fb792 100644 --- a/moto/s3/responses.py +++ b/moto/s3/responses.py @@ -34,10 +34,10 @@ class ResponseObject(object): return 404, headers, "" if isinstance(response, six.string_types): - return 200, headers, response + return 200, headers, response.encode("utf-8") else: status_code, headers, response_content = response - return status_code, headers, response_content + return status_code, headers, response_content.encode("utf-8") def _bucket_response(self, request, full_url, headers): parsed_url = urlparse(full_url) diff --git a/tests/test_s3/test_s3.py b/tests/test_s3/test_s3.py index 6f353e451..3abd6103a 100644 --- a/tests/test_s3/test_s3.py +++ b/tests/test_s3/test_s3.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + from __future__ import unicode_literals from six.moves.urllib.request import urlopen from six.moves.urllib.error import HTTPError @@ -615,3 +617,27 @@ def test_acl_is_ignored_for_now(): key = bucket.get_key(keyname) assert key.get_contents_as_string() == content + + +@mock_s3 +def test_unicode_key(): + conn = boto.connect_s3() + bucket = conn.create_bucket('mybucket') + key = Key(bucket) + key.key = u'こんにちは.jpg' + key.set_contents_from_string('Hello world!') + list(bucket.list()) + key = bucket.get_key(key.key) + assert key.get_contents_as_string() == 'Hello world!' + + +@mock_s3 +def test_unicode_value(): + conn = boto.connect_s3() + bucket = conn.create_bucket('mybucket') + key = Key(bucket) + key.key = 'some_key' + key.set_contents_from_string(u'こんにちは.jpg') + list(bucket.list()) + key = bucket.get_key(key.key) + assert key.get_contents_as_string(encoding='utf-8') == u'こんにちは.jpg'