Add get_probe/probe_first_archive; fullporner and fullpornerorg resolve pornstar names without prefix
This commit is contained in:
@@ -661,6 +661,45 @@ impl Requester {
|
||||
Ok(response)
|
||||
}
|
||||
|
||||
/// Existence probe for archive pages (pornstar / studio / tag / category).
|
||||
///
|
||||
/// Reads the raw response so a real 404/410 answers immediately with
|
||||
/// `Ok(None)` instead of escalating through the Jina/FlareSolverr chain
|
||||
/// (minutes per miss). A Cloudflare challenge (403/503/"Just a moment...")
|
||||
/// is handed to the full chain so FlareSolverr solves it, and 429/5xx are
|
||||
/// retried once.
|
||||
pub async fn get_probe(
|
||||
&mut self,
|
||||
url: &str,
|
||||
headers: Vec<(String, String)>,
|
||||
) -> Result<Option<String>, AnyErr> {
|
||||
let mut last_err = String::new();
|
||||
for _ in 0..2 {
|
||||
match self.get_raw_with_headers(url, headers.clone()).await {
|
||||
Ok(response) => {
|
||||
let status = response.status().as_u16();
|
||||
let body = response.text().await.unwrap_or_default();
|
||||
if status == 404 || status == 410 {
|
||||
return Ok(None);
|
||||
}
|
||||
if status == 403
|
||||
|| status == 503
|
||||
|| Self::looks_like_cloudflare_challenge(&body)
|
||||
{
|
||||
return self.get_with_headers(url, headers, None).await.map(Some);
|
||||
}
|
||||
if status >= 500 || status == 429 {
|
||||
last_err = format!("HTTP {status}");
|
||||
continue;
|
||||
}
|
||||
return Ok(Some(body));
|
||||
}
|
||||
Err(e) => last_err = e.to_string(),
|
||||
}
|
||||
}
|
||||
Err(format!("probe failed for {url}: {last_err}").into())
|
||||
}
|
||||
|
||||
pub async fn get(
|
||||
&mut self,
|
||||
url: &str,
|
||||
|
||||
Reference in New Issue
Block a user