From 1988c957e02311cb4f0f91af529b33b27a1a0a7e Mon Sep 17 00:00:00 2001 From: Dan Felix Date: Thu, 28 Apr 2016 13:16:25 -0700 Subject: [PATCH 1/2] Pass query to _key_response_head for versioning support. --- moto/s3/responses.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/moto/s3/responses.py b/moto/s3/responses.py index 0339d6853..78ffd99b6 100644 --- a/moto/s3/responses.py +++ b/moto/s3/responses.py @@ -372,7 +372,7 @@ class ResponseObject(_TemplateEnvironmentMixin): elif method == 'PUT': return self._key_response_put(request, body, bucket_name, query, key_name, headers) elif method == 'HEAD': - return self._key_response_head(bucket_name, key_name, headers) + return self._key_response_head(bucket_name, query, key_name, headers) elif method == 'DELETE': return self._key_response_delete(bucket_name, query, key_name, headers) elif method == 'POST': @@ -468,8 +468,9 @@ class ResponseObject(_TemplateEnvironmentMixin): headers.update(new_key.response_dict) return 200, headers, template.render(key=new_key) - def _key_response_head(self, bucket_name, key_name, headers): - key = self.backend.get_key(bucket_name, key_name) + def _key_response_head(self, bucket_name, query, key_name, headers): + version_id = query.get('versionId', [None])[0] + key = self.backend.get_key(bucket_name, key_name, version_id=version_id) if key: headers.update(key.metadata) headers.update(key.response_dict) From ebb00a3bfe2676cae985b4801102bf808f546283 Mon Sep 17 00:00:00 2001 From: Dan Felix Date: Thu, 28 Apr 2016 13:17:33 -0700 Subject: [PATCH 2/2] Test key head version_id support using boto3's head_object. --- tests/test_s3/test_s3.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/test_s3/test_s3.py b/tests/test_s3/test_s3.py index 88eb3f985..28aae08a4 100644 --- a/tests/test_s3/test_s3.py +++ b/tests/test_s3/test_s3.py @@ -1000,6 +1000,28 @@ def test_boto3_head_object(): s3.Object('blah', 'hello2.txt').meta.client.head_object(Bucket='blah', Key='hello_bad.txt') +@mock_s3 +def test_boto3_head_object_with_versioning(): + s3 = boto3.resource('s3', region_name='us-east-1') + bucket = s3.create_bucket(Bucket='blah') + bucket.Versioning().enable() + + old_content = 'some text' + new_content = 'some new text' + s3.Object('blah', 'hello.txt').put(Body=old_content) + s3.Object('blah', 'hello.txt').put(Body=new_content) + + head_object = s3.Object('blah', 'hello.txt').meta.client.head_object( + Bucket='blah', Key='hello.txt') + head_object['VersionId'].should.equal('1') + head_object['ContentLength'].should.equal(len(new_content)) + + old_head_object = s3.Object('blah', 'hello.txt').meta.client.head_object( + Bucket='blah', Key='hello.txt', VersionId='0') + old_head_object['VersionId'].should.equal('0') + old_head_object['ContentLength'].should.equal(len(old_content)) + + TEST_XML = """\