diff --git a/discord/http.py b/discord/http.py index 5a5820bd5..1d0b2628c 100644 --- a/discord/http.py +++ b/discord/http.py @@ -131,7 +131,7 @@ class HTTPClient: return await self.__session.ws_connect(url, **kwargs) - async def request(self, route, *, files=None, **kwargs): + async def request(self, route, *, files=None, form=None, **kwargs): bucket = route.bucket method = route.method url = route.url @@ -181,6 +181,13 @@ class HTTPClient: if files: for f in files: f.reset(seek=tries) + + if form: + form_data = aiohttp.FormData() + for params in form: + form_data.add_field(**params) + kwargs['data'] = form_data + try: async with self.__session.request(method, url, **kwargs) as r: log.debug('%s %s with %s has returned %s', method, url, kwargs.get('data'), r.status) @@ -371,7 +378,7 @@ class HTTPClient: def send_files(self, channel_id, *, files, content=None, tts=False, embed=None, nonce=None, allowed_mentions=None, message_reference=None): r = Route('POST', '/channels/{channel_id}/messages', channel_id=channel_id) - form = aiohttp.FormData() + form = [] payload = {'tts': tts} if content: @@ -385,15 +392,25 @@ class HTTPClient: if message_reference: payload['message_reference'] = message_reference - form.add_field('payload_json', utils.to_json(payload)) + form.append({'name': 'payload_json', 'value': utils.to_json(payload)}) if len(files) == 1: file = files[0] - form.add_field('file', file.fp, filename=file.filename, content_type='application/octet-stream') + form.append({ + 'name': 'file', + 'value': file.fp, + 'filename': file.filename, + 'content_type': 'application/octet-stream' + }) else: for index, file in enumerate(files): - form.add_field('file%s' % index, file.fp, filename=file.filename, content_type='application/octet-stream') - - return self.request(r, data=form, files=files) + form.append({ + 'name': 'file%s' % index, + 'value': file.fp, + 'filename': file.filename, + 'content_type': 'application/octet-stream' + }) + + return self.request(r, form=form, files=files) async def ack_message(self, channel_id, message_id): r = Route('POST', '/channels/{channel_id}/messages/{message_id}/ack', channel_id=channel_id, message_id=message_id) diff --git a/discord/webhook.py b/discord/webhook.py index 9b22d42c6..0b0195b23 100644 --- a/discord/webhook.py +++ b/discord/webhook.py @@ -203,13 +203,6 @@ class AsyncWebhookAdapter(WebhookAdapter): if reason: headers['X-Audit-Log-Reason'] = _uriquote(reason, safe='/ ') - if multipart: - data = aiohttp.FormData() - for key, value in multipart.items(): - if key.startswith('file'): - data.add_field(key, value[1], filename=value[0], content_type=value[2]) - else: - data.add_field(key, value) base_url = url.replace(self._request_url, '/') or '/' _id = self._webhook_id @@ -217,6 +210,14 @@ class AsyncWebhookAdapter(WebhookAdapter): for file in files: file.reset(seek=tries) + if multipart: + data = aiohttp.FormData() + for key, value in multipart.items(): + if key.startswith('file'): + data.add_field(key, value[1], filename=value[0], content_type=value[2]) + else: + data.add_field(key, value) + async with self.session.request(verb, url, headers=headers, data=data) as r: log.debug('Webhook ID %s with %s %s has returned status code %s', _id, verb, base_url, r.status) # Coerce empty strings to return None for hygiene purposes