diff --git a/coreapi/transports/http.py b/coreapi/transports/http.py index ecd5bb0..d586021 100644 --- a/coreapi/transports/http.py +++ b/coreapi/transports/http.py @@ -12,6 +12,16 @@ import mimetypes import uritemplate import warnings +from requests_toolbelt.multipart.encoder import MultipartEncoder, MultipartEncoderMonitor +import tqdm + +def tqdm_callback(encoder): + bar = tqdm.tqdm(total=encoder.len, unit="b") + + def callback(monitor): + bar.update(monitor.bytes_read - bar.n) + + return callback Params = collections.namedtuple('Params', ['path', 'query', 'data', 'files']) @@ -222,8 +232,19 @@ def _build_http_request(session, url, method, headers=None, encoding=None, param if encoding == 'application/json': opts['json'] = params.data elif encoding == 'multipart/form-data': - opts['data'] = params.data - opts['files'] = ForceMultiPartDict(params.files) + send_data = [] + for k,v in params.data.items(): + if isinstance(v, (list, tuple)): + for item in v: + send_data.append((k,item)) + else: + send_data.append((k,v)) + for k,v in params.files.items(): + send_data.append((k, (guess_filename(v) or k, v, 'application/*'))) + e = MultipartEncoder(send_data) + monitor = MultipartEncoderMonitor(e, callback=tqdm_callback(e)) + opts['data'] = monitor + opts['headers'].update({'Content-Type': monitor.content_type}) elif encoding == 'application/x-www-form-urlencoded': opts['data'] = params.data elif encoding == 'application/octet-stream': diff --git a/requirements.txt b/requirements.txt index 77e66d0..f47d6c8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,6 +4,7 @@ itypes requests uritemplate tqdm +requests-toolbelt # Testing requirements coverage diff --git a/setup.py b/setup.py index 39f0aa3..9966431 100755 --- a/setup.py +++ b/setup.py @@ -67,7 +67,8 @@ def get_package_data(package): 'requests', 'itypes', 'uritemplate', - 'tqdm' + 'tqdm', + 'requests-toolbelt' ], entry_points={ 'coreapi.codecs': [