use reqwest::Client;
use tracing::debug;
use crate::error::StalkerError;
const PORTAL_PATHS: &[&str] = &[
"/stalker_portal/c/",
"/c/",
"/portal.php",
"/server/load.php",
"/stalker_portal/server/load.php",
];
pub async fn discover_portal(client: &Client, base_url: &str) -> Result<String, StalkerError> {
let base = base_url.trim_end_matches('/');
for path in PORTAL_PATHS {
let url = format!("{base}{path}");
debug!(url = %url, "probing portal path");
match client.get(&url).send().await {
Ok(resp) if resp.status().is_success() || resp.status().is_redirection() => {
debug!(url = %url, status = %resp.status(), "portal found");
return Ok(url);
}
Ok(resp) => {
debug!(
url = %url,
status = %resp.status(),
"portal path returned non-success"
);
}
Err(e) => {
debug!(url = %url, error = %e, "portal path probe failed");
}
}
}
Err(StalkerError::PortalNotFound(base.into()))
}
pub fn known_paths() -> &'static [&'static str] {
PORTAL_PATHS
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn known_paths_includes_standard_entries() {
let paths = known_paths();
assert!(paths.contains(&"/c/"));
assert!(paths.contains(&"/stalker_portal/c/"));
assert!(paths.contains(&"/server/load.php"));
}
}