cloudflare / cloudflare/quiche
quiche seems unable to send requests with long urls
- Dominant language
- Rust
- Stars
- 11.8k
- Forks
- 1.1k
- Avg merge
- 3d 7h
- Merged PRs (30d)
- 16
Description
I added tests in curl using `GET` on long urls, running all HTTP versions and backends. The tests add `n * 'x'` as query string to a url with `n` in [1k, 16k, 32k, 54k]. (see https://github.com/curl/curl/pull/18129).
All QUIC backends except `quiche` work, giving the server 4xx response for the URL being too long. `quiche` is unable to start the stream. This happens in `curl_quiche.c:1025`:
```c
stream3_id = quiche_h3_send_request(ctx->h3c, ctx->qconn, nva, nheader,
stream->send_closed);
if(stream3_id < 0) {
if(QUICHE_H3_ERR_STREAM_BLOCKED == stream3_id) {
/* quiche seems to report this error if the connection window is
* exhausted. Which happens frequently and intermittent. */
CURL_TRC_CF(data, cf, "[%"FMT_PRIu64"] blocked", stream->id);
stream->quic_flow_blocked = TRUE;
result = CURLE_AGAIN;
goto out;
}
...
```
So, we are getting `QUICHE_H3_ERR_STREAM_BLOCKED` and interpret this as a temporary failure, as the description say "retry later". Are we wrong or is there an error code missing for a permanent failure here?
Note: this happens not only the first request of a connection, but also when sending a successful other request with response first.
Please advise.
Version used: quiche v0.24.4
Contributor guide
Research direction
Start with curl_quiche.c:1025 and the long-URL GET tests described in curl PR 18129, using quiche v0.24.4 and the affected HTTP versions and backends. Trace the return value from quiche_h3_send_request and compare QUICHE_H3_ERR_STREAM_BLOCKED with the other backend results. Done means establishing whether this condition is temporary or permanent and documenting or handling it consistently.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- c, rust
- Domain
- networking
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100