Skip to content

Commit a5fb5e2

Browse files
committed
Account for mediocre formdata implementation in curl_cffi (fix #825)
1 parent 18ae077 commit a5fb5e2

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

discord/client.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@ def __init__(self, **options: Any) -> None:
319319
'captcha_handler', None
320320
)
321321
self.http: HTTPClient = HTTPClient(
322+
loop=self.loop,
322323
proxy=proxy,
323324
proxy_auth=proxy_auth,
324325
unsync_clock=unsync_clock,
@@ -853,6 +854,7 @@ async def _async_setup_hook(self) -> None:
853854
loop = asyncio.get_running_loop()
854855
self.loop = loop
855856
self._connection.loop = loop
857+
self.http.loop = loop
856858
await self._connection.async_setup()
857859

858860
self._ready = asyncio.Event()

discord/http.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
import asyncio
2828
import datetime
29+
import io
2930
import logging
3031
import re
3132
import ssl
@@ -591,6 +592,7 @@ def __init__(
591592
self,
592593
connector: Optional[aiohttp.BaseConnector] = None,
593594
*,
595+
loop: asyncio.AbstractEventLoop,
594596
proxy: Optional[str] = None,
595597
proxy_auth: Optional[aiohttp.BasicAuth] = None,
596598
unsync_clock: bool = True,
@@ -602,6 +604,7 @@ def __init__(
602604
rpc_proxy: Optional[str] = None,
603605
) -> None:
604606
self.connector: aiohttp.BaseConnector = connector or MISSING
607+
self.loop: asyncio.AbstractEventLoop = loop
605608
self.__asession: aiohttp.ClientSession = MISSING
606609
self.__session: requests.AsyncSession[requests.Response] = MISSING
607610
# Route key -> Bucket hash
@@ -722,6 +725,20 @@ def get_ratelimit(self, key: str) -> Ratelimit:
722725
self._try_clear_expired_ratelimits()
723726
return value
724727

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+
725742
async def request(
726743
self,
727744
route: Route,
@@ -829,7 +846,7 @@ async def request(
829846
f.reset(seek=tries)
830847

831848
if form:
832-
kwargs['multipart'] = CurlMime.from_list(form)
849+
kwargs['multipart'] = await self._parse_form_data(form)
833850

834851
if self.tracer:
835852
trace_id = self.tracer.generate(self.user_id or 0)

0 commit comments

Comments
 (0)