From bf0bbc584d530f8cbc788794c6efb4e68c0825f2 Mon Sep 17 00:00:00 2001 From: hhursev Date: Wed, 17 Jun 2015 17:10:26 +0300 Subject: [PATCH] Add option to send HEAD request --- tinys3/connection.py | 25 +++++++++++++++++++++++- tinys3/request_factory.py | 15 ++++++++++++++ tinys3/tests/test_non_upload_requests.py | 16 ++++++++++++++- 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/tinys3/connection.py b/tinys3/connection.py index 30b6d76..9581bfd 100644 --- a/tinys3/connection.py +++ b/tinys3/connection.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from .auth import S3Auth -from .request_factory import UploadRequest, UpdateMetadataRequest, CopyRequest, DeleteRequest, GetRequest, ListRequest +from .request_factory import UploadRequest, UpdateMetadataRequest, CopyRequest, DeleteRequest, GetRequest, HeadRequest, ListRequest class Base(object): @@ -72,6 +72,29 @@ def get(self, key, bucket=None): return self.run(r) + def head(self, key, bucket=None): + """ + Get a HEAD response from s3 key + + Params: + - key The key to make HEAD HTTP request to + + - bucket (Optional) The name of the bucket to use (can be skipped if setting the default_bucket) + option for the connection + + Returns: + - A response object from the requests lib or a future that wraps that response object if used with a pool. + + Usage: + + >>> conn.head('my_awesome_key.zip','sample_bucket') + + """ + + r = HeadRequest(self, key, self.bucket(bucket)) + + return self.run(r) + def list(self, prefix='', bucket=None): """ List files diff --git a/tinys3/request_factory.py b/tinys3/request_factory.py index 98a675c..2942ca1 100644 --- a/tinys3/request_factory.py +++ b/tinys3/request_factory.py @@ -59,6 +59,21 @@ def run(self): return r +class HeadRequest(S3Request): + def __init__(self, conn, key, bucket): + super(HeadRequest, self).__init__(conn) + self.key = key + self.bucket = bucket + + def run(self): + url = self.bucket_url(self.key, self.bucket) + r = self.adapter().head(url, auth=self.auth) + + r.raise_for_status() + + return r + + class ListRequest(S3Request): def __init__(self, conn, prefix, bucket): super(ListRequest, self).__init__(conn) diff --git a/tinys3/tests/test_non_upload_requests.py b/tinys3/tests/test_non_upload_requests.py index 0b36424..b1b019e 100644 --- a/tinys3/tests/test_non_upload_requests.py +++ b/tinys3/tests/test_non_upload_requests.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import unittest from flexmock import flexmock -from tinys3.request_factory import CopyRequest, S3Request, UpdateMetadataRequest, DeleteRequest, GetRequest +from tinys3.request_factory import CopyRequest, S3Request, UpdateMetadataRequest, DeleteRequest, GetRequest, HeadRequest from tinys3 import Connection @@ -77,6 +77,20 @@ def test_get_request(self): r.run() + def test_head_request(self): + """ + Test the generation of a head request + """ + + r = HeadRequest(self.conn, 'key_to_get', 'bucket') + + mock = self._mock_adapter(r) + + mock.should_receive('head').with_args('https://s3.amazonaws.com/bucket/key_to_get', + auth=self.conn.auth).and_return(self._mock_response()).once() + + r.run() + def test_update_metadata(self): """ Test the generation of an update metadata request