commit 9825c8018d800a581f6b83cab4ad782871176336
parent 5ae4ad7f3acc035d10e6050dd58b26f8754e32f2
Author: Iván Ávalos <avalos@disroot.org>
Date: Mon, 27 May 2024 10:35:45 -0600
real request cancellation in cURL client
Diffstat:
1 file changed, 16 insertions(+), 0 deletions(-)
diff --git a/quickjs/quickjs-http.c b/quickjs/quickjs-http.c
@@ -23,6 +23,7 @@
#include <string.h>
#include <assert.h>
+#include "curl/multi.h"
#include "cutils.h"
#include "quickjs-http.h"
#include "list.h"
@@ -339,6 +340,8 @@ destroy_impl(void *cls, int request_id)
pthread_mutex_unlock(&ccs->mutex);
+ curl_multi_wakeup(ccs->curlm);
+
return 0;
}
@@ -349,6 +352,7 @@ static void *
curl_multi_thread_run(void *cls)
{
struct CurlClientState *ccs = cls;
+ struct list_head *el, *el1;
int still_running;
struct CURLMsg *m;
BOOL stopped;
@@ -378,6 +382,18 @@ curl_multi_thread_run(void *cls)
}
do {
+ // Remove cancelled requests in queue
+ pthread_mutex_lock(&ccs->mutex);
+ list_for_each_safe(el, el1, &ccs->request_list) {
+ struct CurlRequestState *crs = list_entry(el, struct CurlRequestState, link);
+ if (crs->cancelled) {
+ curl_multi_remove_handle(ccs->curlm, crs->curl);
+ list_del(el);
+ }
+ }
+ pthread_mutex_unlock(&ccs->mutex);
+
+ // Process finished request
int msgq = 0;
m = curl_multi_info_read(ccs->curlm, &msgq);
if (m && (m->msg == CURLMSG_DONE)) {