mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-09 23:27:56 +01:00
b6686d86db
## About The Pull Request This adds `/datum/http_request/proc/fire_and_forget()`, which wraps `rustg_http_request_fire_and_forget`, used for http requests that you just send and don't care about the response. I've changed `send2adminchat_webhook` to use this, as it didn't care about the response at all. Also added a return type hint to `into_response()`, and did some minor cleanup on some assorted `/datum/http_request` code. ## Why It's Good For The Game `fire_and_forget` is very useful because it prevents http request jobs from forever taking up memory if you never call `is_complete()` ## Changelog No user-facing changes.
104 lines
2.3 KiB
Plaintext
104 lines
2.3 KiB
Plaintext
/datum/http_request
|
|
var/id
|
|
var/in_progress = FALSE
|
|
|
|
var/method
|
|
var/body
|
|
var/headers
|
|
var/url
|
|
/// If present response body will be saved to this file.
|
|
var/output_file
|
|
|
|
/// If present request will timeout after this duration
|
|
var/timeout_seconds
|
|
|
|
var/_raw_response
|
|
|
|
/datum/http_request/proc/prepare(method, url, body = "", list/headers, output_file, timeout_seconds)
|
|
if (!length(headers))
|
|
headers = ""
|
|
else
|
|
headers = json_encode(headers)
|
|
|
|
src.method = method
|
|
src.url = url
|
|
src.body = body
|
|
src.headers = headers
|
|
src.output_file = output_file
|
|
src.timeout_seconds = timeout_seconds
|
|
|
|
/datum/http_request/proc/fire_and_forget()
|
|
var/result = rustg_http_request_fire_and_forget(method, url, body, headers, build_options())
|
|
if(result != "ok")
|
|
CRASH("[result]")
|
|
|
|
/datum/http_request/proc/execute_blocking()
|
|
_raw_response = rustg_http_request_blocking(method, url, body, headers, build_options())
|
|
|
|
/datum/http_request/proc/begin_async()
|
|
if (in_progress)
|
|
CRASH("Attempted to re-use a request object.")
|
|
|
|
id = rustg_http_request_async(method, url, body, headers, build_options())
|
|
|
|
if (isnull(text2num(id)))
|
|
_raw_response = "Proc error: [id]"
|
|
CRASH("Proc error: [id]")
|
|
else
|
|
in_progress = TRUE
|
|
|
|
/datum/http_request/proc/build_options()
|
|
return json_encode(list(
|
|
"output_filename" = output_file ? output_file : null,
|
|
"body_filename" = null,
|
|
"timeout_seconds" = timeout_seconds ? timeout_seconds : null,
|
|
))
|
|
|
|
/datum/http_request/proc/is_complete()
|
|
if (isnull(id))
|
|
return TRUE
|
|
|
|
if (!in_progress)
|
|
return TRUE
|
|
|
|
var/response = rustg_http_check_request(id)
|
|
|
|
if (response == RUSTG_JOB_NO_RESULTS_YET)
|
|
return FALSE
|
|
else
|
|
_raw_response = response
|
|
in_progress = FALSE
|
|
return TRUE
|
|
|
|
/datum/http_request/proc/into_response() as /datum/http_response
|
|
var/datum/http_response/response = new
|
|
|
|
try
|
|
var/list/response_data = json_decode(_raw_response)
|
|
response.status_code = response_data["status_code"]
|
|
response.headers = response_data["headers"]
|
|
response.body = response_data["body"]
|
|
catch
|
|
response.errored = TRUE
|
|
response.error = _raw_response
|
|
|
|
return response
|
|
|
|
/datum/http_response
|
|
var/status_code
|
|
var/body
|
|
var/list/headers
|
|
|
|
var/errored = FALSE
|
|
var/error
|
|
|
|
/datum/http_response/serialize_list(list/options, list/semvers)
|
|
. = ..()
|
|
.["status_code"] = status_code
|
|
.["body"] = body
|
|
.["headers"] = headers
|
|
|
|
.["errored"] = errored
|
|
.["error"] = error
|
|
return .
|