From db671ac9bfef9dbcbe5ea357035767cba1fe8311 Mon Sep 17 00:00:00 2001 From: Nordup Date: Wed, 19 Mar 2025 03:40:39 +0400 Subject: [PATCH] cancel http request --- app/scripts/api/backend.gd | 18 ++++++++++++++++-- app/scripts/loading/gate_loader.gd | 2 +- app/scripts/ui/search/prompt_results.gd | 7 ++++++- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/app/scripts/api/backend.gd b/app/scripts/api/backend.gd index 6fb9213..96ba38d 100644 --- a/app/scripts/api/backend.gd +++ b/app/scripts/api/backend.gd @@ -3,7 +3,9 @@ extends Node func request(url: String, callback: Callable, - body: Dictionary = {}, method: int = HTTPClient.METHOD_GET) -> Error: + body: Dictionary = {}, method: int = HTTPClient.METHOD_GET, + cancel_callback: Array = []) -> Error: + var data = JSON.stringify(body) var headers = [] @@ -12,7 +14,12 @@ func request(url: String, callback: Callable, add_child(http) var err = http.request(url, headers, method, data) + cancel_callback.append(func(): http.cancel_request(); remove_child(http)) var res = await http.request_completed + + # If calling object is freed without canceling request + if not callback.is_valid(): return ERR_INVALID_PARAMETER + callback.call(res[0], res[1], res[2], res[3]) remove_child(http) @@ -20,7 +27,9 @@ func request(url: String, callback: Callable, func request_raw(url: String, callback: Callable, - data: PackedByteArray, method: int = HTTPClient.METHOD_GET) -> Error: + data: PackedByteArray, method: int = HTTPClient.METHOD_GET, + cancel_callback: Array = []) -> Error: + var headers = [] var http = HTTPRequest.new() @@ -28,7 +37,12 @@ func request_raw(url: String, callback: Callable, add_child(http) var err = http.request_raw(url, headers, method, data) + cancel_callback.append(func(): http.cancel_request(); remove_child(http)) var res = await http.request_completed + + # If calling object is freed without canceling request + if not callback.is_valid(): return ERR_INVALID_PARAMETER + callback.call(res[0], res[1], res[2], res[3]) remove_child(http) diff --git a/app/scripts/loading/gate_loader.gd b/app/scripts/loading/gate_loader.gd index dbfb4a7..f5f22d5 100644 --- a/app/scripts/loading/gate_loader.gd +++ b/app/scripts/loading/gate_loader.gd @@ -38,7 +38,7 @@ func load_gate(config_url: String) -> void: func load_image(c_gate: ConfigGate) -> void: gate.image = await FileDownloader.download(c_gate.image_url) gate_events.gate_image_loaded_emit(gate) - # finish without image + # Finish without image func load_resources(c_gate: ConfigGate) -> void: diff --git a/app/scripts/ui/search/prompt_results.gd b/app/scripts/ui/search/prompt_results.gd index a5d6dde..6bd35bc 100644 --- a/app/scripts/ui/search/prompt_results.gd +++ b/app/scripts/ui/search/prompt_results.gd @@ -10,6 +10,7 @@ class_name PromptResults var prompt_size: float var result_str: String var last_query: String +var cancel_callbacks: Array = [] func _ready() -> void: @@ -48,11 +49,15 @@ func prompt_request(query: String) -> void: result_str = body.get_string_from_utf8() else: Debug.logclr("Request prompt failed. Code " + str(code), Color.RED) - var err = await Backend.request(url, callback) + var err = await Backend.request(url, callback, {}, HTTPClient.METHOD_GET, cancel_callbacks) if err != HTTPRequest.RESULT_SUCCESS: Debug.logclr("Cannot send request prompt", Color.RED) func clear() -> void: + for callback in cancel_callbacks: + callback.call() + cancel_callbacks.clear() + for child in get_children(): child.queue_free() remove_child(child)