26
26
27
27
import asyncio
28
28
import datetime
29
+ import io
29
30
import logging
30
31
import re
31
32
import ssl
@@ -591,6 +592,7 @@ def __init__(
591
592
self ,
592
593
connector : Optional [aiohttp .BaseConnector ] = None ,
593
594
* ,
595
+ loop : asyncio .AbstractEventLoop ,
594
596
proxy : Optional [str ] = None ,
595
597
proxy_auth : Optional [aiohttp .BasicAuth ] = None ,
596
598
unsync_clock : bool = True ,
@@ -602,6 +604,7 @@ def __init__(
602
604
rpc_proxy : Optional [str ] = None ,
603
605
) -> None :
604
606
self .connector : aiohttp .BaseConnector = connector or MISSING
607
+ self .loop : asyncio .AbstractEventLoop = loop
605
608
self .__asession : aiohttp .ClientSession = MISSING
606
609
self .__session : requests .AsyncSession [requests .Response ] = MISSING
607
610
# Route key -> Bucket hash
@@ -722,6 +725,20 @@ def get_ratelimit(self, key: str) -> Ratelimit:
722
725
self ._try_clear_expired_ratelimits ()
723
726
return value
724
727
728
+ def _parse_form_data (self , form : List [Dict [str , Any ]]) -> asyncio .Future [CurlMime ]:
729
+ def _inner_parse ():
730
+ mime = CurlMime ()
731
+ for part in form :
732
+ _data = part ['data' ].read () if isinstance (part ['data' ], io .IOBase ) else part ['data' ]
733
+ mime .addpart (
734
+ part ['name' ],
735
+ data = _data ,
736
+ filename = part .get ('filename' ),
737
+ content_type = part .get ('content_type' ),
738
+ )
739
+ return mime
740
+ return self .loop .run_in_executor (None , _inner_parse )
741
+
725
742
async def request (
726
743
self ,
727
744
route : Route ,
@@ -829,7 +846,7 @@ async def request(
829
846
f .reset (seek = tries )
830
847
831
848
if form :
832
- kwargs ['multipart' ] = CurlMime . from_list (form )
849
+ kwargs ['multipart' ] = await self . _parse_form_data (form )
833
850
834
851
if self .tracer :
835
852
trace_id = self .tracer .generate (self .user_id or 0 )
0 commit comments