|
25 | 25 | FILE_URL = None |
26 | 26 |
|
27 | 27 | REQUEST_TIMEOUT = 300 |
| 28 | +RETRY_ON_ERROR = False |
| 29 | +RETRY_TIMEOUT = 2 |
28 | 30 | MAX_RETRIES = 3 |
29 | 31 |
|
30 | 32 | REQUEST_LIMIT = 50 |
@@ -90,28 +92,28 @@ async def _process_request(token, url, method='get', params=None, files=None, ** |
90 | 92 | params = _prepare_data(params, files) |
91 | 93 |
|
92 | 94 | timeout = aiohttp.ClientTimeout(total=request_timeout) |
93 | | - got_result = False |
94 | | - current_try=0 |
| 95 | + max_attempts = max(1, MAX_RETRIES if RETRY_ON_ERROR else 1) |
| 96 | + last_error = None |
95 | 97 | session = await session_manager.get_session() |
96 | | - while not got_result and current_try<MAX_RETRIES-1: |
97 | | - current_try +=1 |
| 98 | + for current_try in range(1, max_attempts + 1): |
98 | 99 | try: |
99 | 100 | async with session.request(method=method, url=API_URL.format(token, url), data=params, timeout=timeout, proxy=proxy) as resp: |
100 | | - got_result = True |
101 | 101 | logger.debug("Request: method={0} url={1} params={2} files={3} request_timeout={4} current_try={5}".format(method, url, params, files, request_timeout, current_try).replace(token, token.split(':')[0] + ":{TOKEN}")) |
102 | 102 |
|
103 | 103 | json_result = await _check_result(url, resp) |
104 | 104 | if json_result: |
105 | 105 | return json_result['result'] |
106 | | - except (ApiTelegramException,ApiInvalidJSONException, ApiHTTPException) as e: |
107 | | - raise e |
108 | | - except aiohttp.ClientError as e: |
109 | | - logger.error('Aiohttp ClientError: {0}'.format(e.__class__.__name__)) |
110 | | - except Exception as e: |
111 | | - logger.error(f'Unknown error: {e.__class__.__name__}') |
112 | | - if not got_result: |
113 | | - raise RequestTimeout("Request timeout. Request: method={0} url={1} params={2} files={3} request_timeout={4}".format(method, url, params, files, request_timeout, current_try)) |
114 | | - return None |
| 106 | + return None |
| 107 | + except (aiohttp.ClientError, asyncio.TimeoutError) as e: |
| 108 | + last_error = e |
| 109 | + logger.error('Aiohttp request error: {0} (try #{1})'.format(e.__class__.__name__, current_try)) |
| 110 | + |
| 111 | + if current_try == max_attempts: |
| 112 | + break |
| 113 | + |
| 114 | + await asyncio.sleep(RETRY_TIMEOUT) |
| 115 | + |
| 116 | + raise RequestTimeout("Request timeout. Request: method={0} url={1} params={2} files={3} request_timeout={4} current_try={5}".format(method, url, params, files, request_timeout, current_try)) from last_error |
115 | 117 |
|
116 | 118 | def _prepare_file(obj): |
117 | 119 | """ |
|
0 commit comments