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, headers: PackedStringArray)[/code], ## the headers as [code]"Name: value"[/code] lines. Connection errors and timeouts are ## reported with response code 0 and no headers. [param headers], which name the ## [param body]'s type, are sent as-is. Without [param follow_redirects] a redirect is ## answered as it is, with its [code]Location[/code] header. func request( url: String, method: int, on_complete: Callable, headers: PackedStringArray = PackedStringArray(), body: PackedByteArray = PackedByteArray(), follow_redirects: bool = true, ) -> void: var http_request: HTTPRequest = HTTPRequest.new() http_request.timeout = timeout_seconds if !follow_redirects: http_request.max_redirects = 0 _owner.add_child(http_request) http_request.request_completed.connect( func( result: int, response_code: int, response_headers: PackedStringArray, response_body: PackedByteArray, ) -> void: http_request.queue_free() if result != HTTPRequest.RESULT_SUCCESS: on_complete.call(0, response_body, PackedStringArray()) return on_complete.call(response_code, response_body, response_headers) ) var error: int = http_request.request_raw(url, 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(), PackedStringArray())