Where: oxyroute/app.py:24-53 (_ProtocolWrapper), used in __rsgi__ when access_log_hook is set (app.py:796-813).
The wrapper proxies response_empty/response_str/response_bytes/response_file/response_stream, but Granian's RSGI protocol object is also callable (await protocol()) to read the request body and asynchronously iterable for streaming bodies — neither __call__ nor __aiter__/__anext__ is forwarded. Any route that reads a JSON/form body while access_log_hook is configured should fail under real Granian (not caught by the test suite, which drives handle_rsgi directly and bypasses __rsgi__/the wrapper for the body-read step).
Fix direction: forward __call__ and the async-iterator protocol to self._inner on _ProtocolWrapper; add an integration test that exercises access_log_hook + a body-reading route through __rsgi__.
Where:
oxyroute/app.py:24-53(_ProtocolWrapper), used in__rsgi__whenaccess_log_hookis set (app.py:796-813).The wrapper proxies
response_empty/response_str/response_bytes/response_file/response_stream, but Granian's RSGI protocol object is also callable (await protocol()) to read the request body and asynchronously iterable for streaming bodies — neither__call__nor__aiter__/__anext__is forwarded. Any route that reads a JSON/form body whileaccess_log_hookis configured should fail under real Granian (not caught by the test suite, which driveshandle_rsgidirectly and bypasses__rsgi__/the wrapper for the body-read step).Fix direction: forward
__call__and the async-iterator protocol toself._inneron_ProtocolWrapper; add an integration test that exercisesaccess_log_hook+ a body-reading route through__rsgi__.