-
-
Notifications
You must be signed in to change notification settings - Fork 57
Description
Hi, I came across inconsistent behaviour with the reason in the HttpError exception. It seems to depend on the pipe_to function argument being present or not. If we have a pipe_to argument, the non-200 response doesn't have the error reason field populated.
Why is it important?
According to google docs there are at least 8 possible reasons for getting a 403 response. The recommended approach to dealing with 403s depends on the returned reason in the non-200 response.
Code example to reproduce
import asyncio
from aiofiles.tempfile import NamedTemporaryFile
from aiogoogle import Aiogoogle
from aiogoogle.auth.creds import ServiceAccountCreds
creds = {...}
async def example_api_call(**kwargs):
async with Aiogoogle(
service_account_creds=ServiceAccountCreds(
scopes=["https://www.googleapis.com/auth/drive.readonly"],
**creds,
)
) as google_client:
drive = await google_client.discover(
api_name="drive", api_version="v3"
)
first_page_with_next_attached = (
await google_client.as_service_account(
drive.files.export(**kwargs),
full_res=True
)
)
async for page_items in first_page_with_next_attached:
yield page_items
async def example():
await anext(example_api_call(
fileId="...",
mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
))In this scenario, when calling the client directly, the 403 response will cause a HttpError to be thrown with a reason:
Forbidden
Content:
{'code': 403,
'errors': [{'domain': 'global',
'message': 'This file is too large to be exported.',
'reason': 'exportSizeLimitExceeded'}],
'message': 'This file is too large to be exported.'}
Request URL:
https://www.googleapis.com/drive/v3/files/...
But when using a pipe_to argument, the HttpError won't contain the error reason.
async def example():
async with NamedTemporaryFile(mode="wb", delete=False) as async_buffer:
await anext(example_api_call(
fileId="...",
mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
pipe_to=async_buffer,
))Thrown error:
Forbidden
Request URL:
https://www.googleapis.com/drive/v3/files/...
Next steps
I suppose it's not expected behaviour. The reason in the error response should (always?) be populated, meaning we can access it e.g. via e.res.reason in case we encounter HttpError e.
I'm happy to contribute with a PR if you feel like this issue should be addressed.
Also, thank you for building and maintaining this library. 🥇