You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.1 KiB
79 lines
2.1 KiB
extends Node
|
|
class_name HttpRequestQueue
|
|
|
|
|
|
signal http_response_received(content_type, body)
|
|
signal http_response_failed(error_code)
|
|
signal request_completed(id, result, response_code, headers, body)
|
|
signal request_completed_ex(id, result, response_code, http_headers, body)
|
|
|
|
|
|
const REQUEST_ID_NO_ID = '{no_id}'
|
|
|
|
|
|
var _http_request: HTTPRequest
|
|
var request_queue = Array()
|
|
var busy = false
|
|
var current_request_id: String = REQUEST_ID_NO_ID
|
|
|
|
# hooks
|
|
func _ready() -> void:
|
|
__initialize_http_request()
|
|
|
|
# public
|
|
func enqueue_request(id: String, url: String, headers: PoolStringArray=PoolStringArray()) -> void:
|
|
request_queue.append({'id': id, 'url': url, 'headers': headers})
|
|
|
|
if not busy:
|
|
__process_request_queue()
|
|
|
|
# private
|
|
func __initialize_http_request() -> void:
|
|
_http_request = HTTPRequest.new()
|
|
|
|
add_child(_http_request)
|
|
|
|
_http_request.use_threads = true
|
|
|
|
_http_request.connect("request_completed", self, "_on_http_request_completed")
|
|
|
|
# private
|
|
func __process_request_queue() -> void:
|
|
if request_queue.empty():
|
|
busy = false
|
|
|
|
return
|
|
|
|
if busy:
|
|
return
|
|
|
|
busy = true
|
|
|
|
var request_data := request_queue.pop_front() as Dictionary
|
|
var request_url: String = request_data.get('url')
|
|
var request_headers: PoolStringArray = request_data.get('headers')
|
|
current_request_id = request_data.get('id')
|
|
|
|
_http_request.request(request_url, request_headers)
|
|
|
|
|
|
# events
|
|
func _on_http_request_completed(result: int, response_code: int, headers: PoolStringArray, body: PoolByteArray) -> void:
|
|
var http_headers := HttpHeaders.new(headers)
|
|
emit_signal("request_completed", current_request_id, result, response_code, headers, body)
|
|
emit_signal("request_completed_ex", current_request_id, result, response_code, http_headers, body)
|
|
|
|
if result == HTTPRequest.RESULT_SUCCESS:
|
|
|
|
var content_type := http_headers.get('Content-Type') as String
|
|
|
|
emit_signal("http_response_received", content_type, body)
|
|
|
|
else:
|
|
emit_signal("http_response_failed", response_code)
|
|
|
|
current_request_id = REQUEST_ID_NO_ID
|
|
busy = false
|
|
|
|
__process_request_queue()
|