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) -> 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).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,
)
})
.buffer_unordered(25)
.collect()
.await;
Ok(results.into_iter().flatten().collect())
}