You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I want to report an inconsistent behavior we've observed. It affects production, was very confusing and hard to understand/debug.
Initially we had a replica set of hypercorn-based applications, and the same request was processed fine by the majority of instances, but not by one of a few others. The server didn't even log such requests.
After the investigation I've discovered that this limit is not always enforced. The library adds next chunk and tries to parse it before enforcing the limit. So if a request exceeds the limit, it will still be parsed successfully if it comes in one chunk (which is often the case).
So practically the same request could be parsed successfully or not depending on how the OS and TCP stack chunks it.
I want to report an inconsistent behavior we've observed. It affects production, was very confusing and hard to understand/debug.
Initially we had a replica set of
hypercorn
-based applications, and the same request was processed fine by the majority of instances, but not by one of a few others. The server didn't even log such requests.After the investigation I've discovered that this limit is not always enforced. The library adds next chunk and tries to parse it before enforcing the limit. So if a request exceeds the limit, it will still be parsed successfully if it comes in one chunk (which is often the case).
So practically the same request could be parsed successfully or not depending on how the OS and TCP stack chunks it.
Here is a demo:
h11-issue-demo.zip
$ pip install --requirement requirements.txt $ pytest FAILED test_client.py::test_fails_slightly_above_limit[uvicorn_endpoint-False] - assert not True FAILED test_client.py::test_fails_slightly_above_limit[hypercorn_endpoint-False] - assert not True ========================================================================================== 2 failed, 10 passed in 2.16s ===========================================================================================
Inconsistency highlight:
$ pytest -k test_fails_slightly_above_limit FAILED test_client.py::test_fails_slightly_above_limit[uvicorn_endpoint-False] - assert not True FAILED test_client.py::test_fails_slightly_above_limit[hypercorn_endpoint-False] - assert not True ==================================================================================== 2 failed, 2 passed, 8 deselected in 0.84s ====================================================================================
I think it should be more stable and consistent. Should the library check buffer size before the parsing attempt? What do you think?
The text was updated successfully, but these errors were encountered: