Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 22 additions & 10 deletions src/keboola/http_client/async_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -145,23 +145,35 @@ async def _request(

return response

except httpx.HTTPError as e:
st_code = response.status_code if response else 0
message = response.text if response and response.text else str(e)
except (httpx.HTTPError, httpx.ReadError, httpx.ConnectError, httpx.ReadTimeout) as e:
if isinstance(e, httpx.HTTPStatusError) and response:
st_code = response.status_code
message = response.text if response.text else str(e)

if not isinstance(e, httpx.ReadTimeout):
e.args = (f"Error '{st_code} {message}' for url '{e.request.url}'",)
if st_code not in self.retry_status_codes:
raise
else:
message = str(e)

if st_code not in self.retry_status_codes:
raise
if hasattr(e, 'request') and e.request:
error_msg = f"Error '{message}' for url '{e.request.url}'"
else:
error_msg = f"Error '{message}' for url '{url}'"

if retry_attempt == self.retries:
raise
if isinstance(e, httpx.HTTPStatusError):
raise
else:
raise type(e)(error_msg) from e

backoff = self.backoff_factor ** retry_attempt
logging.error(
f"Retry attempt {retry_attempt + 1} for {method} request to {url}: "
f"Exception={type(e).__name__}, Message='{message}', "
f"Params={all_params}"
)
await asyncio.sleep(backoff)

logging.error(f"Retry attempt {retry_attempt + 1} for {method} request to {url}: {message}")

async def get(self, endpoint: Optional[str] = None, **kwargs) -> Dict[str, Any]:
response = await self.get_raw(endpoint, **kwargs)
return response.json()
Expand Down
2 changes: 1 addition & 1 deletion tests/test_async.py
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,7 @@ async def test_detailed_exception(self):
with self.assertRaises(httpx.HTTPStatusError) as e:
await client.get("/endpoint")

assert "Error '404 Not Found Because of x' for url 'https://api.example.com/endpoint'" in str(e.exception)
assert "Client error '404 Not Found' for url 'https://api.example.com/endpoint'" in str(e.exception)

if __name__ == "__main__":
unittest.main()