use setTimeout for removing requests

This commit is contained in:
ading2210 2024-03-21 12:57:48 -07:00
parent 1ad301b26c
commit 74c1e9d943
4 changed files with 24 additions and 14 deletions

View file

@ -7,6 +7,7 @@ session_get_active
session_remove_request session_remove_request
session_cleanup session_cleanup
request_cleanup
create_request create_request
get_version get_version
get_cacert get_cacert

View file

@ -56,7 +56,11 @@ class CurlSession {
} }
remove_request_now(request_ptr) { remove_request_now(request_ptr) {
_session_remove_request(this.session_ptr, request_ptr); if (this.session_ptr) {
_session_remove_request(this.session_ptr, request_ptr);
}
_request_cleanup(request_ptr);
let request_index = this.requests_list.indexOf(request_ptr); let request_index = this.requests_list.indexOf(request_ptr);
if (request_index !== -1) { if (request_index !== -1) {
this.requests_list.splice(request_index, 1); this.requests_list.splice(request_index, 1);
@ -66,7 +70,9 @@ class CurlSession {
//remove the request on the next iteration of the loop //remove the request on the next iteration of the loop
remove_request(request_ptr) { remove_request(request_ptr) {
this.assert_ready(); this.assert_ready();
this.to_remove.push(request_ptr); setTimeout(() => {
this.remove_request_now(request_ptr);
}, 1)
} }
start_request(request_ptr) { start_request(request_ptr) {
@ -88,13 +94,7 @@ class CurlSession {
event_loop_func() { event_loop_func() {
let libcurl_active = _session_get_active(this.session_ptr); let libcurl_active = _session_get_active(this.session_ptr);
if (libcurl_active || this.active_requests || this.to_remove) { if (libcurl_active || this.active_requests) {
if (this.to_remove.length) {
for (let request_ptr of this.to_remove) {
this.remove_request_now(request_ptr);
}
this.to_remove = [];
}
_session_perform(this.session_ptr); _session_perform(this.session_ptr);
} }
else { else {
@ -103,8 +103,7 @@ class CurlSession {
} }
} }
close() { close_now() {
this.assert_ready();
for (let request_ptr of this.requests_list) { for (let request_ptr of this.requests_list) {
this.remove_request_now(request_ptr); this.remove_request_now(request_ptr);
} }
@ -112,6 +111,13 @@ class CurlSession {
this.session_ptr = null; this.session_ptr = null;
} }
close() {
this.assert_ready();
setTimeout(() => {
this.close_now();
}, 1);
}
//wrap request callbacks using a readable stream and return the new callbacks //wrap request callbacks using a readable stream and return the new callbacks
stream_response(url, headers_callback, end_callback, abort_signal) { stream_response(url, headers_callback, end_callback, abort_signal) {
let stream_controller; let stream_controller;

View file

@ -55,6 +55,12 @@ CURL* create_request(const char* url, DataCallback data_callback, EndCallback en
return http_handle; return http_handle;
} }
void request_cleanup(CURL* http_handle) {
struct RequestInfo *request_info = get_request_info(http_handle);
curl_easy_cleanup(http_handle);
free(request_info);
}
void finish_request(CURLMsg *curl_msg) { void finish_request(CURLMsg *curl_msg) {
CURL *http_handle = curl_msg->easy_handle; CURL *http_handle = curl_msg->easy_handle;
struct RequestInfo *request_info = get_request_info(http_handle); struct RequestInfo *request_info = get_request_info(http_handle);

View file

@ -41,10 +41,7 @@ int session_get_active(struct SessionInfo *session) {
} }
void session_remove_request(struct SessionInfo *session, CURL* http_handle) { void session_remove_request(struct SessionInfo *session, CURL* http_handle) {
struct RequestInfo *request_info = get_request_info(http_handle);
curl_multi_remove_handle(session->multi_handle, http_handle); curl_multi_remove_handle(session->multi_handle, http_handle);
curl_easy_cleanup(http_handle);
free(request_info);
} }
void session_cleanup(struct SessionInfo *session) { void session_cleanup(struct SessionInfo *session) {