The server keeps a play queue per client, identified by the X-Queue-Id header. The client sends the ID it has for the selected server with every request and keeps the one in each response, which is new after a reset or a sync. The IDs are saved per server in the [queues] section of settings.cfg, so the game goes on with the same queue after a restart. HttpTransport now passes the response headers on to the client.
54 lines
1.9 KiB
GDScript
54 lines
1.9 KiB
GDScript
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] 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,
|
|
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 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(), PackedStringArray())
|