Skip to content

Conversation

@yanxurui
Copy link

I am using this library in a project and found there is an issue when combined with cache.

Check the example below:

import asyncio
import aiohttp
from aiohttp_client_cache import CachedSession, CacheBackend


async def main():
    request_cache = CacheBackend(expire_after=60*60)
    async with CachedSession(cache=request_cache, auto_decompress=False) as s:
    # async with aiohttp.ClientSession() as s:
        while True:
            resp = await s.request('GET', 'https://www.googleapis.com/oauth2/v1/certs')
            content = await resp.content.read()
            body = await resp.read()
            import pdb
            pdb.set_trace()

# call main() in a loop
loop = asyncio.get_event_loop()
loop.run_until_complete(main())

In the 3rd iteration of the loop above, content will be an empty string while body is expected. This is probably because the content stream was GCed. Use .read() instead of .content.read() can fix the problem.

@yanxurui yanxurui requested review from a team as code owners March 14, 2023 14:23
@google-cla
Copy link

google-cla bot commented Mar 14, 2023

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

chalmerlowe pushed a commit that referenced this pull request Dec 19, 2025
Using .read() is more robust when working with caching libraries like
aiohttp-client-cache, which may cause .content.read() to return empty
bytes on subsequent reads. .read() ensures the full body is returned.

Fixes #1248
chalmerlowe pushed a commit that referenced this pull request Dec 19, 2025
Using .read() is more robust when working with caching libraries like
aiohttp-client-cache, which may cause .content.read() to return empty
bytes on subsequent reads. .read() ensures the full body is returned.

Fixes #1248
@chalmerlowe
Copy link
Contributor

Closing in deference to PR #1899 which includes this fix and updates unit tests.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants