|
@@ -0,0 +1,35 @@
|
|
|
+"""Useful functions to patch third part libraries until they are fixed."""
|
|
|
+
|
|
|
+import aiohttp
|
|
|
+from urllib.parse import quote
|
|
|
+
|
|
|
+
|
|
|
+def hacked_content_disposition_header(disptype, quote_fields=True, **params):
|
|
|
+ """Prevent aiohttp from encoding file names as URLs.
|
|
|
+
|
|
|
+ Thanks @Nickoala (Nick Lee) for this hack from his archived `telepot` repo.
|
|
|
+ See https://github.com/nickoala/telepot/blob/master/telepot/aio/hack.py
|
|
|
+ for details.
|
|
|
+ """
|
|
|
+ if not disptype or not (aiohttp.helpers.TOKEN > set(disptype)):
|
|
|
+ raise ValueError('bad content disposition type {!r}'
|
|
|
+ ''.format(disptype))
|
|
|
+
|
|
|
+ value = disptype
|
|
|
+ if params:
|
|
|
+ lparams = []
|
|
|
+ for key, val in params.items():
|
|
|
+ if not key or not (aiohttp.helpers.TOKEN > set(key)):
|
|
|
+ raise ValueError('bad content disposition parameter'
|
|
|
+ ' {!r}={!r}'.format(key, val))
|
|
|
+
|
|
|
+ if key == 'filename':
|
|
|
+ qval = val
|
|
|
+ else:
|
|
|
+ qval = quote(val, '') if quote_fields else val
|
|
|
+
|
|
|
+ lparams.append((key, '"%s"' % qval))
|
|
|
+
|
|
|
+ sparams = '; '.join('='.join(pair) for pair in lparams)
|
|
|
+ value = '; '.join((value, sparams))
|
|
|
+ return value
|