Better handling of multipart data
When post_data is passed straight through, it is mistakenly treated as application/x-www-form-urlencoded instead of multipart/form-data.
By replicating as a new FormData object, we avoid this issue.
diff --git a/aardvark.py b/aardvark.py
index f313dd5..e9b92bd 100644
--- a/aardvark.py
+++ b/aardvark.py
@@ -218,14 +218,25 @@
async with aiohttp.ClientSession(auto_decompress=False) as session:
try:
req_headers = request.headers.copy()
+ # We have to replicate the form data or we mess up file transfers
+ form_data = None
if post_dict:
- del req_headers["content-length"]
+ form_data = aiohttp.FormData()
+ if "content-length" in req_headers:
+ del req_headers["content-length"]
+ if "content-type" in req_headers:
+ del req_headers["content-type"]
+ for k, v in post_dict.items():
+ if isinstance(v, aiohttp.web.FileField): # This sets multipart properly in the request
+ form_data.add_field(name=v.name, filename=v.filename, value=v.file.raw, content_type=v.content_type)
+ else:
+ form_data.add_field(name=k, value=v)
async with session.request(
request.method,
target_url,
headers=req_headers,
params=get_data,
- data=post_dict or post_data,
+ data=form_data or post_data,
timeout=30,
) as resp:
result = resp