summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Eissing <stefan@eissing.org>2023-04-24 13:28:12 +0200
committerDaniel Stenberg <daniel@haxx.se>2023-04-25 17:50:57 +0200
commit3b7a8a25b66aacb6a8b83088246b3cca30da19e5 (patch)
treea9d0b2c46d7166a1cc4ed544f673942a5feb6d22
parent5622e431edd748452a4bdb179f45c405357f0618 (diff)
downloadcurl-3b7a8a25b66aacb6a8b83088246b3cca30da19e5.tar.gz
http3: expire unpaused transfers in all HTTP/3 backends
Closes #11005
-rw-r--r--lib/vquic/curl_msh3.c14
-rw-r--r--lib/vquic/curl_ngtcp2.c16
-rw-r--r--lib/vquic/curl_quiche.c16
3 files changed, 46 insertions, 0 deletions
diff --git a/lib/vquic/curl_msh3.c b/lib/vquic/curl_msh3.c
index 34ea0bcf6..7d23f9f5b 100644
--- a/lib/vquic/curl_msh3.c
+++ b/lib/vquic/curl_msh3.c
@@ -739,6 +739,17 @@ static void cf_msh3_active(struct Curl_cfilter *cf, struct Curl_easy *data)
ctx->active = TRUE;
}
+static CURLcode h3_data_pause(struct Curl_cfilter *cf,
+ struct Curl_easy *data,
+ bool pause)
+{
+ if(!pause) {
+ drain_stream(cf, data);
+ Curl_expire(data, 0, EXPIRE_RUN_NOW);
+ }
+ return CURLE_OK;
+}
+
static CURLcode cf_msh3_data_event(struct Curl_cfilter *cf,
struct Curl_easy *data,
int event, int arg1, void *arg2)
@@ -755,6 +766,9 @@ static CURLcode cf_msh3_data_event(struct Curl_cfilter *cf,
case CF_CTRL_DATA_SETUP:
result = h3_data_setup(cf, data);
break;
+ case CF_CTRL_DATA_PAUSE:
+ result = h3_data_pause(cf, data, (arg1 != 0));
+ break;
case CF_CTRL_DATA_DONE:
h3_data_done(cf, data);
break;
diff --git a/lib/vquic/curl_ngtcp2.c b/lib/vquic/curl_ngtcp2.c
index 2f4b4cdb4..6eee431cc 100644
--- a/lib/vquic/curl_ngtcp2.c
+++ b/lib/vquic/curl_ngtcp2.c
@@ -2096,6 +2096,19 @@ static bool cf_ngtcp2_data_pending(struct Curl_cfilter *cf,
return stream && !Curl_bufq_is_empty(&stream->recvbuf);
}
+static CURLcode h3_data_pause(struct Curl_cfilter *cf,
+ struct Curl_easy *data,
+ bool pause)
+{
+ /* TODO: there seems right now no API in ngtcp2 to shrink/enlarge
+ * the streams windows. As we do in HTTP/2. */
+ if(!pause) {
+ drain_stream(cf, data);
+ Curl_expire(data, 0, EXPIRE_RUN_NOW);
+ }
+ return CURLE_OK;
+}
+
static CURLcode cf_ngtcp2_data_event(struct Curl_cfilter *cf,
struct Curl_easy *data,
int event, int arg1, void *arg2)
@@ -2110,6 +2123,9 @@ static CURLcode cf_ngtcp2_data_event(struct Curl_cfilter *cf,
switch(event) {
case CF_CTRL_DATA_SETUP:
break;
+ case CF_CTRL_DATA_PAUSE:
+ result = h3_data_pause(cf, data, (arg1 != 0));
+ break;
case CF_CTRL_DATA_DONE: {
h3_data_done(cf, data);
break;
diff --git a/lib/vquic/curl_quiche.c b/lib/vquic/curl_quiche.c
index afd446b2e..e32cc366d 100644
--- a/lib/vquic/curl_quiche.c
+++ b/lib/vquic/curl_quiche.c
@@ -1114,6 +1114,19 @@ static bool cf_quiche_data_pending(struct Curl_cfilter *cf,
return stream && !Curl_bufq_is_empty(&stream->recvbuf);
}
+static CURLcode h3_data_pause(struct Curl_cfilter *cf,
+ struct Curl_easy *data,
+ bool pause)
+{
+ /* TODO: there seems right now no API in quiche to shrink/enlarge
+ * the streams windows. As we do in HTTP/2. */
+ if(!pause) {
+ drain_stream(cf, data);
+ Curl_expire(data, 0, EXPIRE_RUN_NOW);
+ }
+ return CURLE_OK;
+}
+
static CURLcode cf_quiche_data_event(struct Curl_cfilter *cf,
struct Curl_easy *data,
int event, int arg1, void *arg2)
@@ -1127,6 +1140,9 @@ static CURLcode cf_quiche_data_event(struct Curl_cfilter *cf,
result = h3_data_setup(cf, data);
break;
}
+ case CF_CTRL_DATA_PAUSE:
+ result = h3_data_pause(cf, data, (arg1 != 0));
+ break;
case CF_CTRL_DATA_DONE: {
h3_data_done(cf, data);
break;