class_name HttpTransport extends RefCounted ## Sends HTTP requests for [code]MusicServerClient[/code] using [HTTPRequest] nodes. ## ## Tests subclass this to answer requests without a network connection. ## Seconds before a request is given up and reported as failed. This covers the whole ## download, so it is generous enough for long songs on a slow connection. var timeout_seconds: float = 120.0 var _owner: Node func _init(owner: Node) -> void: _owner = owner ## Requests [param url] and calls [param on_complete] with ## [code](response_code: int, body: PackedByteArray)[/code]. Connection errors and ## timeouts are reported with response code 0. [param headers] are sent as-is; a ## [param body] is sent as JSON. func request( url: String, method: int, on_complete: Callable, headers: PackedStringArray = PackedStringArray(), body: String = "", ) -> void: var http_request: HTTPRequest = HTTPRequest.new() http_request.timeout = timeout_seconds _owner.add_child(http_request) http_request.request_completed.connect( func( result: int, response_code: int, _headers: PackedStringArray, response_body: PackedByteArray, ) -> void: http_request.queue_free() on_complete.call(response_code if result == HTTPRequest.RESULT_SUCCESS else 0, response_body) ) var all_headers: PackedStringArray = headers.duplicate() if method == HTTPClient.METHOD_PUT || !body.is_empty(): all_headers.append("Content-Type: application/json") var error: int = http_request.request(url, all_headers, method, body) if error != OK: http_request.queue_free() push_error("Could not send request to %s (error %d)" % [url, error]) on_complete.call(0, PackedByteArray())