Skip to content

Commit 0b84f3a

Browse files
committed
Use built-in retry mechanism
1 parent ac25da0 commit 0b84f3a

File tree

3 files changed

+12
-45
lines changed

3 files changed

+12
-45
lines changed

filestack/uploads/intelligent_ingestion.py

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
import mimetypes
55
import hashlib
66
import logging
7-
import time
87
import functools
9-
from multiprocessing.pool import ThreadPool
108
import threading
9+
from urllib3.util.retry import Retry
10+
from multiprocessing.pool import ThreadPool
1111

1212
from base64 import b64encode
1313

@@ -143,17 +143,12 @@ def upload(apikey, filepath, file_obj, storage, params=None, security=None):
143143
payload['store']['workflows'] = params['workflows']
144144

145145
complete_url = 'https://{}/multipart/complete'.format(start_response['location_url'])
146-
for wait_time in (0, 1, 2, 3, 5):
147-
time.sleep(wait_time)
148-
complete_response = requests.post(complete_url, json=payload, headers=config.HEADERS)
149-
log.debug('Complete response: %s. Content: %s', complete_response, complete_response.content)
150-
if complete_response.status_code == 200:
151-
break
152-
else:
153-
log.error(
154-
'Did not receive a correct complete response: %s. Content %s',
155-
complete_response, complete_response.content
156-
)
157-
raise
158-
159-
return complete_response.json()
146+
session = requests.Session()
147+
retries = Retry(total=7, backoff_factor=0.2, status_forcelist=[202], method_whitelist=frozenset(['POST']))
148+
session.mount('http://', requests.adapters.HTTPAdapter(max_retries=retries))
149+
response = session.post(complete_url, json=payload, headers=config.HEADERS)
150+
if response.status_code != 200:
151+
log.error('Did not receive a correct complete response: %s. Content %s', response, response.content)
152+
raise Exception('Invalid complete response: {}'.format(response.content))
153+
154+
return response.json()

filestack/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class RequestsWrapper:
1919
def __getattr__(self, name):
2020
if name in ('get', 'post', 'put', 'delete'):
2121
return partial(self.handle_request, name)
22-
return super().__getattribute__(name)
22+
return original_requests.__getattribute__(name)
2323

2424
def handle_request(self, name, *args, **kwargs):
2525
if 'headers' not in kwargs:

tests/intelligent_ingestion_test.py

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -90,31 +90,3 @@ def test_min_chunk_size_exception(post_mock, put_mock):
9090
upload_part(
9191
'Aaaaapikey', 'file.txt', 'tests/data/doom.mp4', 5415034, 's3', defaultdict(lambda: 'fs-upload.com'), part
9292
)
93-
94-
95-
@patch('filestack.uploads.intelligent_ingestion.time.sleep')
96-
@patch('filestack.uploads.intelligent_ingestion.requests.post')
97-
@patch('filestack.uploads.intelligent_ingestion.upload_part')
98-
def test_wait_for_complete(upload_part, post_mock, sleep_mock):
99-
post_mock.side_effect = [
100-
DummyHttpResponse(json_dict={
101-
'uri': 'upload-uri', 'region': 'upload-region', 'upload_id': 'upload-id',
102-
'location_url': 'upload-loc-url'
103-
}), # start response
104-
DummyHttpResponse(status_code=202),
105-
DummyHttpResponse(status_code=202),
106-
DummyHttpResponse(status_code=202),
107-
DummyHttpResponse(status_code=200)
108-
]
109-
security = Security({'expires': 999}, 'secret')
110-
upload_params = {'filename': 'new-filename.mp4', 'path': 'some/new/path'}
111-
upload('AAApikeyz', 'tests/data/doom.mp4', None, 's3', upload_params, security)
112-
assert post_mock.call_count == 5
113-
start_resp_args, start_resp_kwargs = post_mock.call_args_list[0]
114-
url = start_resp_args[0]
115-
request_payload = start_resp_kwargs['json']
116-
assert url == 'https://upload.filestackapi.com/multipart/start'
117-
assert request_payload['store']['path'] == 'some/new/path'
118-
assert request_payload['filename'] == 'new-filename.mp4'
119-
assert request_payload['policy'] == 'eyJleHBpcmVzIjogOTk5fQ=='
120-
assert request_payload['signature'] == 'c0b1b4d794f867287eedb34e477805aa7f5e1c9d1ec24fc55a085608b79e65fa'

0 commit comments

Comments
 (0)