diff --git a/client/exported_funcs.txt b/client/exported_funcs.txt index dbcb9ae..0a61260 100644 --- a/client/exported_funcs.txt +++ b/client/exported_funcs.txt @@ -7,6 +7,7 @@ session_get_active session_remove_request session_cleanup +request_cleanup create_request get_version get_cacert diff --git a/client/javascript/session.js b/client/javascript/session.js index bd17e64..d028c17 100644 --- a/client/javascript/session.js +++ b/client/javascript/session.js @@ -56,7 +56,11 @@ class CurlSession { } 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); if (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_request(request_ptr) { this.assert_ready(); - this.to_remove.push(request_ptr); + setTimeout(() => { + this.remove_request_now(request_ptr); + }, 1) } start_request(request_ptr) { @@ -88,13 +94,7 @@ class CurlSession { event_loop_func() { let libcurl_active = _session_get_active(this.session_ptr); - if (libcurl_active || this.active_requests || this.to_remove) { - if (this.to_remove.length) { - for (let request_ptr of this.to_remove) { - this.remove_request_now(request_ptr); - } - this.to_remove = []; - } + if (libcurl_active || this.active_requests) { _session_perform(this.session_ptr); } else { @@ -103,8 +103,7 @@ class CurlSession { } } - close() { - this.assert_ready(); + close_now() { for (let request_ptr of this.requests_list) { this.remove_request_now(request_ptr); } @@ -112,6 +111,13 @@ class CurlSession { 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 stream_response(url, headers_callback, end_callback, abort_signal) { let stream_controller; diff --git a/client/libcurl/request.c b/client/libcurl/request.c index f3ac7ac..534dd87 100644 --- a/client/libcurl/request.c +++ b/client/libcurl/request.c @@ -55,6 +55,12 @@ CURL* create_request(const char* url, DataCallback data_callback, EndCallback en 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) { CURL *http_handle = curl_msg->easy_handle; struct RequestInfo *request_info = get_request_info(http_handle); diff --git a/client/libcurl/session.c b/client/libcurl/session.c index 0b03a02..fc28b09 100644 --- a/client/libcurl/session.c +++ b/client/libcurl/session.c @@ -41,10 +41,7 @@ int session_get_active(struct SessionInfo *session) { } 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_easy_cleanup(http_handle); - free(request_info); } void session_cleanup(struct SessionInfo *session) {