low-and-slow/slowlorris "attack" on client
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 1.5k
- Forks
- 78
- Avg merge
- 8h 59m
- Merged PRs (30d)
- 24
Description
Originally opened by
@Granitosauruson 2021-01-11 09:36:15 in encode/httpx
- The bug is reproducible against the latest release and/or
master. - There are no similar issues or pull requests to fix it yet.
Currently both async and sync client requests are succeptible to low-and-slow "attacks" unless explicitly handled. In other words when request is being streamed as long as 1 byte every 2 seconds (or aprox.) is being generated the connection will not close or timeout with none of the current available settings.
It's possible for the server to serve single html page almost idefinitely and hang the client thread.
Maybe httpx should introduce some optional or even default handlers for this? Maybe it's already possible to hook something like this in easily?
To reproduce
resp = httpx.get(
"http://httpbin.org/drip?duration=30&numbytes=30&code=200&delay=2",
timeout=Timeout(connect=3, read=3, write=3, pool=3, timeout=3),
)
The above code snippet will take 30+ seconds to complete disregarding any timeout settings. The only way to avoid this is to explitictly wrap everything in either asyncio.wait_for() for async code and for sync code seems to be much more complicated (?).
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by running the provided httpx.get reproduction against the latest project code, then trace how the connect, read, write, pool, and total timeout settings are handled for both sync and async clients. Review the existing timeout tests and discussion before deciding the expected behavior; done means the slow-drip case is bounded by an available timeout mechanism without regressing normal streaming.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- networking
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100