bpo-32622: Enforce sendfile fallback policy for FALLBACK transports (… · python/cpython@b1a6ac4 (original) (raw)

2 files changed

lines changed

Original file line number Diff line number Diff line change
@@ -1035,7 +1035,12 @@ async def sendfile(self, transport, file, offset=0, count=None,
1035 1035 except events.SendfileNotAvailableError as exc:
1036 1036 if not fallback:
1037 1037 raise
1038 -# the mode is FALLBACK or fallback is True
1038 +
1039 +if not fallback:
1040 +raise RuntimeError(
1041 +f"fallback is disabled and native sendfile is not "
1042 +f"supported for transport {transport!r}")
1043 +
1039 1044 return await self._sendfile_fallback(transport, file,
1040 1045 offset, count)
1041 1046
Original file line number Diff line number Diff line change
@@ -27,6 +27,7 @@
27 27
28 28 import asyncio
29 29 from asyncio import base_events
30 +from asyncio import constants
30 31 from asyncio import coroutines
31 32 from asyncio import events
32 33 from asyncio import proactor_events
@@ -2381,6 +2382,14 @@ async def coro():
2381 2382 ret = self.run_loop(t)
2382 2383 self.assertEqual(ret, len(self.DATA))
2383 2384
2385 +def test_sendfile_no_fallback_for_fallback_transport(self):
2386 +transport = mock.Mock()
2387 +transport.is_closing.side_effect = lambda: False
2388 +transport._sendfile_compatible = constants._SendfileMode.FALLBACK
2389 +with self.assertRaisesRegex(RuntimeError, 'fallback is disabled'):
2390 +self.loop.run_until_complete(
2391 +self.loop.sendfile(transport, None, fallback=False))
2392 +
2384 2393
2385 2394 if sys.platform == 'win32':
2386 2395