Skip to content

Commit

Permalink
getmoto#2710 - S3 - Raise specific error when GetObject is called wit…
Browse files Browse the repository at this point in the history
…h unknown VersionId
  • Loading branch information
bblommers committed Dec 9, 2020
1 parent 4aff714 commit 6cde20b
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 1 deletion.
18 changes: 18 additions & 0 deletions moto/s3/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@
{% block extra %}<KeyName>{{ key_name }}</KeyName>{% endblock %}
"""

ERROR_WITH_ARGUMENT = """{% extends 'single_error' %}
{% block extra %}<ArgumentName>{{ name }}</ArgumentName>
<ArgumentValue>{{ value }}</ArgumentValue>{% endblock %}
"""

ERROR_WITH_CONDITION_NAME = """{% extends 'single_error' %}
{% block extra %}<Condition>{{ condition }}</Condition>{% endblock %}
"""
Expand Down Expand Up @@ -68,6 +73,19 @@ def __init__(self, key_name):
)


class MissingVersion(S3ClientError):
code = 404

def __init__(self, version_id, *args, **kwargs):
kwargs.setdefault("template", "argument_error")
kwargs["name"] = "versionId"
kwargs["value"] = version_id
self.templates["argument_error"] = ERROR_WITH_ARGUMENT
super(MissingVersion, self).__init__(
"InvalidArgument", "Invalid version id specified", *args, **kwargs
)


class ObjectNotInActiveTierError(S3ClientError):
code = 403

Expand Down
5 changes: 4 additions & 1 deletion moto/s3/responses.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
S3ClientError,
MissingBucket,
MissingKey,
MissingVersion,
InvalidPartOrder,
MalformedXML,
MalformedACLError,
Expand Down Expand Up @@ -1163,8 +1164,10 @@ def _key_response_get(self, bucket_name, query, key_name, headers):
if_unmodified_since = headers.get("If-Unmodified-Since", None)

key = self.backend.get_object(bucket_name, key_name, version_id=version_id)
if key is None:
if key is None and version_id is None:
raise MissingKey(key_name)
elif key is None:
raise MissingVersion(version_id)

if if_unmodified_since:
if_unmodified_since = str_to_rfc_1123_datetime(if_unmodified_since)
Expand Down
19 changes: 19 additions & 0 deletions tests/test_s3/test_s3.py
Original file line number Diff line number Diff line change
Expand Up @@ -4911,3 +4911,22 @@ def test_request_partial_content_should_contain_actual_content_length():
)
e.response["Error"]["ActualObjectSize"].should.equal("9")
e.response["Error"]["RangeRequested"].should.equal(requested_range)


@mock_s3
def test_get_unknown_version_should_throw_specific_error():
bucket_name = "my_bucket"
object_key = "hello.txt"
s3 = boto3.resource("s3", region_name="us-east-1")
client = boto3.client("s3", region_name="us-east-1")
bucket = s3.create_bucket(Bucket=bucket_name)
bucket.Versioning().enable()
content = "some text"
s3.Object(bucket_name, object_key).put(Body=content)

with pytest.raises(ClientError) as e:
client.get_object(Bucket=bucket_name, Key=object_key, VersionId="unknown")
e.value.response["Error"]["Code"].should.equal("InvalidArgument")
e.value.response["Error"]["Message"].should.equal("Invalid version id specified")
e.value.response["Error"]["ArgumentName"].should.equal("versionId")
e.value.response["Error"]["ArgumentValue"].should.equal("unknown")

0 comments on commit 6cde20b

Please sign in to comment.