pub mod detect;
pub mod extract;
pub mod rules;
use futures::StreamExt;
use gossan_core::Target;
use secfinding::Finding;
pub async fn probe(
client: &reqwest::Client,
target: &Target,
rate_limiter: &std::sync::Arc<crate::HostRateLimiter>,
host: &str,
) -> anyhow::Result<Vec<Finding>> {
let Target::Web(asset) = target else {
return Ok(vec![]);
};
let base = asset.url.as_str().trim_end_matches('/');
let is_catch_all = detect::is_catch_all(client, base, rate_limiter, host).await;
let checks = rules::get_owned_checks();
let results: Vec<Vec<Finding>> = futures::stream::iter(checks)
.map(|c| {
extract::process_check(
client.clone(),
base.to_string(),
target.clone(),
c,
is_catch_all,
std::sync::Arc::clone(rate_limiter),
host.to_string(),
)
})
.buffer_unordered(25)
.collect()
.await;
Ok(results.into_iter().flatten().collect())
}