S3 - Return default content type (#4439)
This commit is contained in:
parent
a192a42e8f
commit
e388a25141
@ -25,6 +25,7 @@ from moto.core.utils import (
|
|||||||
)
|
)
|
||||||
from moto.cloudwatch.models import MetricDatum
|
from moto.cloudwatch.models import MetricDatum
|
||||||
from moto.utilities.tagging_service import TaggingService
|
from moto.utilities.tagging_service import TaggingService
|
||||||
|
from moto.utilities.utils import LowercaseDict
|
||||||
from moto.s3.exceptions import (
|
from moto.s3.exceptions import (
|
||||||
AccessDeniedByLock,
|
AccessDeniedByLock,
|
||||||
BucketAlreadyExists,
|
BucketAlreadyExists,
|
||||||
@ -113,7 +114,7 @@ class FakeKey(BaseModel):
|
|||||||
self.acl = get_canned_acl("private")
|
self.acl = get_canned_acl("private")
|
||||||
self.website_redirect_location = None
|
self.website_redirect_location = None
|
||||||
self._storage_class = storage if storage else "STANDARD"
|
self._storage_class = storage if storage else "STANDARD"
|
||||||
self._metadata = {}
|
self._metadata = LowercaseDict()
|
||||||
self._expiry = None
|
self._expiry = None
|
||||||
self._etag = etag
|
self._etag = etag
|
||||||
self._version_id = version_id
|
self._version_id = version_id
|
||||||
@ -136,6 +137,9 @@ class FakeKey(BaseModel):
|
|||||||
self.lock_legal_status = lock_legal_status
|
self.lock_legal_status = lock_legal_status
|
||||||
self.lock_until = lock_until
|
self.lock_until = lock_until
|
||||||
|
|
||||||
|
# Default metadata values
|
||||||
|
self._metadata["Content-Type"] = "binary/octet-stream"
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def version_id(self):
|
def version_id(self):
|
||||||
return self._version_id
|
return self._version_id
|
||||||
|
@ -4,6 +4,9 @@ import string
|
|||||||
import pkgutil
|
import pkgutil
|
||||||
|
|
||||||
|
|
||||||
|
from collections.abc import MutableMapping
|
||||||
|
|
||||||
|
|
||||||
def str2bool(v):
|
def str2bool(v):
|
||||||
if v in ("yes", True, "true", "True", "TRUE", "t", "1"):
|
if v in ("yes", True, "true", "True", "TRUE", "t", "1"):
|
||||||
return True
|
return True
|
||||||
@ -52,3 +55,32 @@ def filter_resources(resources, filters, attr_pairs):
|
|||||||
result.remove(resource)
|
result.remove(resource)
|
||||||
break
|
break
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
class LowercaseDict(MutableMapping):
|
||||||
|
"""A dictionary that lowercases all keys"""
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
self.store = dict()
|
||||||
|
self.update(dict(*args, **kwargs)) # use the free update to set keys
|
||||||
|
|
||||||
|
def __getitem__(self, key):
|
||||||
|
return self.store[self._keytransform(key)]
|
||||||
|
|
||||||
|
def __setitem__(self, key, value):
|
||||||
|
self.store[self._keytransform(key)] = value
|
||||||
|
|
||||||
|
def __delitem__(self, key):
|
||||||
|
del self.store[self._keytransform(key)]
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
return iter(self.store)
|
||||||
|
|
||||||
|
def __len__(self):
|
||||||
|
return len(self.store)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return str(self.store)
|
||||||
|
|
||||||
|
def _keytransform(self, key):
|
||||||
|
return key.lower()
|
||||||
|
@ -6468,3 +6468,21 @@ def test_delete_objects_with_empty_keyname():
|
|||||||
|
|
||||||
client.delete_object(Bucket=bucket_name, Key=key_name)
|
client.delete_object(Bucket=bucket_name, Key=key_name)
|
||||||
client.list_objects(Bucket=bucket_name).shouldnt.have.key("Contents")
|
client.list_objects(Bucket=bucket_name).shouldnt.have.key("Contents")
|
||||||
|
|
||||||
|
|
||||||
|
@mock_s3
|
||||||
|
def test_head_object_should_return_default_content_type():
|
||||||
|
s3 = boto3.resource("s3", region_name="us-east-1")
|
||||||
|
s3.create_bucket(Bucket="testbucket")
|
||||||
|
s3.Bucket("testbucket").upload_fileobj(BytesIO(b"foobar"), Key="testobject")
|
||||||
|
s3_client = boto3.client("s3", region_name="us-east-1")
|
||||||
|
resp = s3_client.head_object(Bucket="testbucket", Key="testobject")
|
||||||
|
|
||||||
|
resp["ContentType"].should.equal("binary/octet-stream")
|
||||||
|
resp["ResponseMetadata"]["HTTPHeaders"]["content-type"].should.equal(
|
||||||
|
"binary/octet-stream"
|
||||||
|
)
|
||||||
|
|
||||||
|
s3.Object("testbucket", "testobject").content_type.should.equal(
|
||||||
|
"binary/octet-stream"
|
||||||
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user