Add feature flag to force all direct download URLs to be proxied
Fixes #1667
This commit is contained in:
parent
2b00c644b5
commit
dd2e086a20
12 changed files with 350 additions and 34 deletions
|
@ -5,10 +5,8 @@ from functools import wraps
|
|||
|
||||
from storage.basestorage import StoragePaths, BaseStorage, BaseStorageV2
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def _location_aware(unbound_func):
|
||||
@wraps(unbound_func)
|
||||
def wrapper(self, locations, *args, **kwargs):
|
||||
|
@ -27,17 +25,19 @@ def _location_aware(unbound_func):
|
|||
|
||||
|
||||
class DistributedStorage(StoragePaths):
|
||||
def __init__(self, storages, preferred_locations=None, default_locations=None):
|
||||
def __init__(self, storages, preferred_locations=None, default_locations=None, proxy=None):
|
||||
self._storages = dict(storages)
|
||||
self.preferred_locations = list(preferred_locations or [])
|
||||
self.default_locations = list(default_locations or [])
|
||||
self.proxy = proxy
|
||||
|
||||
@property
|
||||
def locations(self):
|
||||
""" Returns the names of the locations supported. """
|
||||
return list(self._storages.keys())
|
||||
|
||||
get_direct_download_url = _location_aware(BaseStorage.get_direct_download_url)
|
||||
_get_direct_download_url = _location_aware(BaseStorage.get_direct_download_url)
|
||||
|
||||
get_direct_upload_url = _location_aware(BaseStorage.get_direct_upload_url)
|
||||
get_content = _location_aware(BaseStorage.get_content)
|
||||
put_content = _location_aware(BaseStorage.put_content)
|
||||
|
@ -55,6 +55,19 @@ class DistributedStorage(StoragePaths):
|
|||
complete_chunked_upload = _location_aware(BaseStorageV2.complete_chunked_upload)
|
||||
cancel_chunked_upload = _location_aware(BaseStorageV2.cancel_chunked_upload)
|
||||
|
||||
|
||||
def get_direct_download_url(self, locations, path, expires_in=600, requires_cors=False,
|
||||
head=False):
|
||||
download_url = self._get_direct_download_url(locations, path, expires_in, requires_cors, head)
|
||||
if download_url is None:
|
||||
return None
|
||||
|
||||
if self.proxy is None:
|
||||
return download_url
|
||||
|
||||
return self.proxy.proxy_download_url(download_url)
|
||||
|
||||
|
||||
def copy_between(self, path, source_location, destination_location):
|
||||
""" Copies a file between the source location and the destination location. """
|
||||
source_storage = self._storages[source_location]
|
||||
|
|
Reference in a new issue