]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
http3: expire unpaused transfers in all HTTP/3 backends
authorStefan Eissing <stefan@eissing.org>
Mon, 24 Apr 2023 11:28:12 +0000 (13:28 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 25 Apr 2023 15:50:57 +0000 (17:50 +0200)
Closes #11005

lib/vquic/curl_msh3.c
lib/vquic/curl_ngtcp2.c
lib/vquic/curl_quiche.c

index 34ea0bcf625941b03d3e1f561fea227b0e2da6f4..7d23f9f5b0d2ee050f6d22cace67657708c5f8e9 100644 (file)
@@ -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;
index 2f4b4cdb481a61e712ef520031fec7e697a513cb..6eee431cc8d8f275f998057db1267047b59988a7 100644 (file)
@@ -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;
index afd446b2e477cfc93d69fe5a20798c3e236038a7..e32cc366d7033193a15951dd52b17f1e0491dfb6 100644 (file)
@@ -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;