|
4 | 4 |
|
5 | 5 | import contextlib |
6 | 6 | from asyncio import TimeoutError as AsyncTimeoutError |
| 7 | +from contextlib import asynccontextmanager |
7 | 8 | from copy import deepcopy |
8 | 9 | from csv import writer |
9 | 10 | from io import StringIO |
10 | 11 | from json import dumps |
11 | 12 | from pathlib import Path |
12 | | -from typing import TYPE_CHECKING, Any |
| 13 | +from typing import TYPE_CHECKING, Any, AsyncGenerator |
13 | 14 | from urllib.parse import urljoin |
14 | 15 |
|
15 | 16 | from aiohttp.http_exceptions import HttpProcessingError |
@@ -3012,10 +3013,15 @@ async def _fetch(self): |
3012 | 3013 | def _fetch_info(self): |
3013 | 3014 | return "subreddit_about", {"subreddit": self}, None |
3014 | 3015 |
|
3015 | | - async def _read_and_post_media(self, file: Path, upload_url: str, upload_data: dict[str, Any]) -> ClientResponse: |
| 3016 | + @asynccontextmanager |
| 3017 | + async def _read_and_post_media( |
| 3018 | + self, file: Path, upload_url: str, upload_data: dict[str, Any] |
| 3019 | + ) -> AsyncGenerator[ClientResponse]: |
3016 | 3020 | with file.open("rb") as media: |
3017 | 3021 | upload_data["file"] = media |
3018 | | - return await self._reddit._core._requestor._http.post(upload_url, data=upload_data) |
| 3022 | + async with self._reddit._core._requestor.request("POST", upload_url, data=upload_data |
| 3023 | + ) as response: |
| 3024 | + yield response |
3019 | 3025 |
|
3020 | 3026 | async def _submit_media( |
3021 | 3027 | self, *, data: dict[Any, Any], timeout: int, without_websockets: bool |
@@ -3107,13 +3113,13 @@ async def _upload_media( |
3107 | 3113 | upload_url = f"https:{upload_lease['action']}" |
3108 | 3114 | upload_data = {item["name"]: item["value"] for item in upload_lease["fields"]} |
3109 | 3115 |
|
3110 | | - response = await self._read_and_post_media(file, upload_url, upload_data) |
3111 | | - if response.status != 201: |
3112 | | - await self._parse_xml_response(response) |
3113 | | - try: |
3114 | | - response.raise_for_status() |
3115 | | - except HttpProcessingError: |
3116 | | - raise ServerError(response=response) from None |
| 3116 | + async with self._read_and_post_media(file, upload_url, upload_data) as response: |
| 3117 | + if response.status != 201: |
| 3118 | + await self._parse_xml_response(response) |
| 3119 | + try: |
| 3120 | + response.raise_for_status() |
| 3121 | + except HttpProcessingError: |
| 3122 | + raise ServerError(response=response) from None |
3117 | 3123 |
|
3118 | 3124 | if upload_type == "link": |
3119 | 3125 | return f"{upload_url}/{upload_data['key']}" |
|
0 commit comments