Skip to content

Commit

Permalink
Merge pull request #96 from mattbriancon/s3boto-url-expires
Browse files Browse the repository at this point in the history
Optionally override querystring_expire in S3BotoStorage.url
  • Loading branch information
jschneier committed Jan 13, 2016
2 parents 133a9de + 1372816 commit 1479829
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 9 deletions.
21 changes: 15 additions & 6 deletions storages/backends/s3boto.py
Original file line number Diff line number Diff line change
Expand Up @@ -474,17 +474,26 @@ def modified_time(self, name):
# Parse the last_modified string to a local datetime object.
return parse_ts(entry.last_modified)

def url(self, name, headers=None, response_headers=None):
def url(self, name, headers=None, response_headers=None, expire=None):
# Preserve the trailing slash after normalizing the path.
name = self._normalize_name(self._clean_name(name))
if self.custom_domain:
return "%s//%s/%s" % (self.url_protocol,
self.custom_domain, filepath_to_uri(name))
return self.connection.generate_url(self.querystring_expire,
method='GET', bucket=self.bucket.name, key=self._encode_name(name),
headers=headers,
query_auth=self.querystring_auth, force_http=not self.secure_urls,
response_headers=response_headers)

if expire is None:
expire = self.querystring_expire

return self.connection.generate_url(
expire,
method='GET',
bucket=self.bucket.name,
key=self._encode_name(name),
headers=headers,
query_auth=self.querystring_auth,
force_http=not self.secure_urls,
response_headers=response_headers,
)

def get_available_name(self, name, max_length=None):
""" Overwrite existing file with the same name. """
Expand Down
18 changes: 15 additions & 3 deletions tests/test_s3boto.py
Original file line number Diff line number Diff line change
Expand Up @@ -263,9 +263,7 @@ def test_storage_url(self):
url = 'http://aws.amazon.com/%s' % name
self.storage.connection.generate_url.return_value = url

self.assertEquals(self.storage.url(name), url)
self.storage.connection.generate_url.assert_called_with(
self.storage.querystring_expire,
kwargs = dict(
method='GET',
bucket=self.storage.bucket.name,
key=name,
Expand All @@ -275,6 +273,20 @@ def test_storage_url(self):
response_headers=None,
)

self.assertEquals(self.storage.url(name), url)
self.storage.connection.generate_url.assert_called_with(
self.storage.querystring_expire,
**kwargs
)

custom_expire = 123

self.assertEquals(self.storage.url(name, expire=custom_expire), url)
self.storage.connection.generate_url.assert_called_with(
custom_expire,
**kwargs
)

def test_generated_url_is_encoded(self):
self.storage.custom_domain = "mock.cloudfront.net"
filename = "whacky & filename.mp4"
Expand Down

0 comments on commit 1479829

Please sign in to comment.