Skip to content

Commit

Permalink
S3Boto3Storage with custom domain now accepts url parameters (#1054)
Browse files Browse the repository at this point in the history
  • Loading branch information
vinayinvicible authored Sep 9, 2021
1 parent 55a8000 commit 65f8a55
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 4 deletions.
12 changes: 8 additions & 4 deletions storages/backends/s3boto3.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from datetime import datetime, timedelta
from gzip import GzipFile
from tempfile import SpooledTemporaryFile
from urllib.parse import parse_qsl, urlsplit
from urllib.parse import parse_qsl, urlencode, urlsplit

from django.contrib.staticfiles.storage import ManifestFilesMixin
from django.core.exceptions import ImproperlyConfigured, SuspiciousOperation
Expand Down Expand Up @@ -559,12 +559,17 @@ def _strip_signing_parameters(self, url):
def url(self, name, parameters=None, expire=None, http_method=None):
# Preserve the trailing slash after normalizing the path.
name = self._normalize_name(self._clean_name(name))
params = parameters.copy() if parameters else {}
if expire is None:
expire = self.querystring_expire

if self.custom_domain:
url = "{}//{}/{}".format(
self.url_protocol, self.custom_domain, filepath_to_uri(name))
url = "{}//{}/{}{}".format(
self.url_protocol,
self.custom_domain,
filepath_to_uri(name),
"?{}".format(urlencode(params)) if params else "",
)

if self.querystring_auth and self.cloudfront_signer:
expiration = datetime.utcnow() + timedelta(seconds=expire)
Expand All @@ -573,7 +578,6 @@ def url(self, name, parameters=None, expire=None, http_method=None):

return url

params = parameters.copy() if parameters else {}
params['Bucket'] = self.bucket.name
params['Key'] = name
url = self.bucket.meta.client.generate_presigned_url('get_object', Params=params,
Expand Down
8 changes: 8 additions & 0 deletions tests/test_s3boto3.py
Original file line number Diff line number Diff line change
Expand Up @@ -627,6 +627,14 @@ def test_special_characters(self):
parsed_url = urlparse(url)
self.assertEqual(parsed_url.path, "/%C3%A3l%C3%B6h%C3%A2.jpg")

def test_custom_domain_parameters(self):
self.storage.custom_domain = "mock.cloudfront.net"
filename = "filename.mp4"
url = self.storage.url(filename, parameters={"version": 10})
parsed_url = urlparse(url)
self.assertEqual(parsed_url.path, "/filename.mp4")
self.assertEqual(parsed_url.query, "version=10")

def test_strip_signing_parameters(self):
expected = 'http://bucket.s3-aws-region.amazonaws.com/foo/bar'
self.assertEqual(self.storage._strip_signing_parameters(
Expand Down

0 comments on commit 65f8a55

Please sign in to comment.