diff --git a/dmsrc/file.dm b/dmsrc/file.dm index 3f9083e..fe0300d 100644 --- a/dmsrc/file.dm +++ b/dmsrc/file.dm @@ -1 +1,3 @@ +// FILE Operations // + #define rustutils_file_write_b64decode(text, fname) CALL_LIB(RUST_UTILS, "file_write")(text, fname, "true") diff --git a/dmsrc/jobs.dm b/dmsrc/jobs.dm new file mode 100644 index 0000000..290841f --- /dev/null +++ b/dmsrc/jobs.dm @@ -0,0 +1,5 @@ +// JOBS // + +#define RUSTUTILS_JOB_NO_RESULTS_YET "NO RESULTS YET" +#define RUSTUTILS_JOB_NO_SUCH_JOB "NO SUCH JOB" +#define RUSTUTILS_JOB_ERROR "JOB PANICKED" diff --git a/dmsrc/regexp.dm b/dmsrc/regexp.dm index 18e69f3..a07d0d1 100644 --- a/dmsrc/regexp.dm +++ b/dmsrc/regexp.dm @@ -1 +1,3 @@ +// Regex // + #define rustutils_regex_replace(text, re, re_params, replacement) CALL_LIB(RUST_UTILS, "regex_replace")(text, re, re_params, replacement) diff --git a/dmsrc/transliteration.dm b/dmsrc/transliteration.dm index 34701a8..786b982 100644 --- a/dmsrc/transliteration.dm +++ b/dmsrc/transliteration.dm @@ -1,2 +1,4 @@ +// Transliteration + #define rustutils_cyrillic_to_latin(text) CALL_LIB(RUST_UTILS, "cyrillic_to_latin")("[text]") #define rustutils_latin_to_cyrillic(text) CALL_LIB(RUST_UTILS, "latin_to_cyrillic")("[text]") diff --git a/src/error.rs b/src/error.rs index f818095..5bc89f7 100644 --- a/src/error.rs +++ b/src/error.rs @@ -20,7 +20,7 @@ pub enum Error { JsonSerialization(#[from] serde_json::Error), #[cfg(feature = "http")] #[error(transparent)] - Request(#[from] Box), + Response(#[from] ureq::Transport), } impl From for Error { diff --git a/src/http.rs b/src/http.rs index bfbd3b7..9d6e181 100644 --- a/src/http.rs +++ b/src/http.rs @@ -3,6 +3,8 @@ use serde::{Deserialize, Serialize}; use std::cell::RefCell; use std::collections::{BTreeMap, HashMap}; use std::io::Write; +use std::time::Duration; +use ureq::OrAnyStatus; // ---------------------------------------------------------------------------- // Interface @@ -95,7 +97,8 @@ fn construct_request( "head" => client.head(url), _ => client.get(url), } - .set("User-Agent", &format!("{PKG_NAME}/{VERSION}")); + .set("User-Agent", &format!("{PKG_NAME}/{VERSION}")) + .timeout(Duration::from_secs(30)); let mut final_body = body.as_bytes().to_vec(); @@ -138,7 +141,7 @@ fn construct_request( } fn submit_request(prep: RequestPrep) -> Result { - let response = prep.req.send_bytes(&prep.body).map_err(Box::new)?; + let response = prep.req.send_bytes(&prep.body).or_any_status()?; let body; let mut resp = Response { diff --git a/tests/dm-tests.rs b/tests/dm-tests.rs index a383d88..4500592 100644 --- a/tests/dm-tests.rs +++ b/tests/dm-tests.rs @@ -12,6 +12,12 @@ fn regexp() { run_dm_tests("regexp"); } +#[cfg(feature = "http")] +#[test] +fn http() { + run_dm_tests("http"); +} + fn run_dm_tests(name: &str) { std::env::remove_var("RUST_BACKTRACE"); diff --git a/tests/dm/common.dm b/tests/dm/common.dm index 693d11e..60201c7 100644 --- a/tests/dm/common.dm +++ b/tests/dm/common.dm @@ -2,7 +2,7 @@ #include "../../target/rust_utils.dm" /world/New() - world.log << "Rust is at [RUST_UTILS]" + log << "Rust is at [RUST_UTILS]" for(var/func in typesof(/test/proc)) log << "[func] [copytext("------------------------------------------------------------------------", length("[func]"))]" call(new /test, func)() diff --git a/tests/dm/http.dme b/tests/dm/http.dme new file mode 100644 index 0000000..bec0ef7 --- /dev/null +++ b/tests/dm/http.dme @@ -0,0 +1,35 @@ +#include "common.dm" + +#define STATUS200URL "https://httpstat.us/200" +#define STATUS400URL "https://httpstat.us/400" + +/proc/execute_request(url) + rustutils_create_async_http_client() + var/id = rustutils_http_request_async(RUSTUTILS_HTTP_METHOD_GET, url, "", list(), null) + + var/r + do + r = rustutils_http_check_request(id) + // sleep(1) + while(r == RUSTUTILS_JOB_NO_RESULTS_YET) + + ASSERT(r != RUSTUTILS_JOB_ERROR) + rustutils_close_async_http_client() + + var/list/L = json_decode(r) + return L + +/test/proc/test_200() + var/list/L = execute_request(STATUS200URL) + ASSERT(L["status_code"] == 200) + +/test/proc/test_400() + var/list/L = execute_request(STATUS400URL) + ASSERT(L["status_code"] == 400) + +/test/proc/nonexistent() + try + var/list/L = execute_request("http://nonexistent.nonexistent") + CRASH("Should have failed") + catch + return diff --git a/tests/dm/regexp.dme b/tests/dm/regexp.dme index 3acd128..ec00c13 100644 --- a/tests/dm/regexp.dme +++ b/tests/dm/regexp.dme @@ -15,5 +15,4 @@ var/expected_error = "Words replace." /test/proc/crash() var/output = rustutils_regex_replace(input, pattern, incorrect_pattern_flags, replacement) - world.log << output ASSERT(output == expected_error)