From 1a48e1f898035e3bedc981f06520842c55977706 Mon Sep 17 00:00:00 2001 From: kleine-safie Date: Wed, 10 Jun 2026 11:05:30 +0900 Subject: [PATCH] support for pause_reading --- aioresponses/compat.py | 5 +++++ aioresponses/core.py | 2 ++ tests/test_aioresponses.py | 11 ++++++++++- tox.ini | 11 ++++++----- 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/aioresponses/compat.py b/aioresponses/compat.py index 83fd47a..e95ecb2 100644 --- a/aioresponses/compat.py +++ b/aioresponses/compat.py @@ -2,6 +2,7 @@ import asyncio # noqa: F401 from re import Pattern from typing import Dict, Optional, Union # noqa +from unittest.mock import Mock from urllib.parse import parse_qsl, urlencode from aiohttp import __version__ as aiohttp_version, StreamReader @@ -17,6 +18,10 @@ def stream_reader_factory( # noqa loop: 'Optional[asyncio.AbstractEventLoop]' = None ) -> StreamReader: protocol = ResponseHandler(loop=loop) + # Satisfies BaseProtocol's flow control hooks that + # fire when a large payload exceeds the StreamReader limit. + protocol._parser = Mock() + protocol._parser.feed_data.return_value = ([], False, b'') return StreamReader(protocol, limit=2 ** 16, loop=loop) diff --git a/aioresponses/core.py b/aioresponses/core.py index a904cf9..52640f3 100644 --- a/aioresponses/core.py +++ b/aioresponses/core.py @@ -182,6 +182,8 @@ def _build_response(self, url: 'Union[URL, str]', headers=CIMultiDictProxy(self._prepare_request_headers(request_headers)), real_url=url ) + if 'stream_writer' in inspect.signature(response_class).parameters: + kwargs['stream_writer'] = Mock(output_size=0) kwargs['writer'] = None kwargs['continue100'] = None kwargs['timer'] = TimerNoop() diff --git a/tests/test_aioresponses.py b/tests/test_aioresponses.py index 68bec3f..45c0d87 100644 --- a/tests/test_aioresponses.py +++ b/tests/test_aioresponses.py @@ -4,9 +4,10 @@ from asyncio import CancelledError, TimeoutError from random import uniform from typing import Coroutine, Generator, Union -from unittest.mock import patch +from unittest.mock import MagicMock, patch from aiohttp import hdrs +from aiohttp.base_protocol import BaseProtocol from aiohttp import http from aiohttp.client import ClientSession from aiohttp.client_reqrep import ClientResponse @@ -312,6 +313,14 @@ async def test_streaming(self, m): content = await resp.content.read() self.assertEqual(content, b'Test') + @aioresponses() + async def test_streaming_large_body(self, m): + body = b'x' * (1024 * 1024) + m.get(self.url, body=body) + resp = await self.session.get(self.url) + content = await resp.content.read() + self.assertEqual(content, body) + @aioresponses() async def test_streaming_up_to(self, m): m.get(self.url, body='Test')