diff --git a/impit-python/src/async_client.rs b/impit-python/src/async_client.rs index 1401f7fd..8963371a 100644 --- a/impit-python/src/async_client.rs +++ b/impit-python/src/async_client.rs @@ -59,55 +59,12 @@ impl AsyncClient { ) -> PyResult { let builder = ImpitBuilder::default(); - let builder = - match browser { - Some(browser) => match browser.to_lowercase().as_str() { - "chrome" | "chrome124" => builder - .with_fingerprint(impit::fingerprint::database::chrome_125::fingerprint()), - "chrome100" => builder - .with_fingerprint(impit::fingerprint::database::chrome_100::fingerprint()), - "chrome101" => builder - .with_fingerprint(impit::fingerprint::database::chrome_101::fingerprint()), - "chrome104" => builder - .with_fingerprint(impit::fingerprint::database::chrome_104::fingerprint()), - "chrome107" => builder - .with_fingerprint(impit::fingerprint::database::chrome_107::fingerprint()), - "chrome110" => builder - .with_fingerprint(impit::fingerprint::database::chrome_110::fingerprint()), - "chrome116" => builder - .with_fingerprint(impit::fingerprint::database::chrome_116::fingerprint()), - "chrome125" => builder - .with_fingerprint(impit::fingerprint::database::chrome_125::fingerprint()), - "chrome131" => builder - .with_fingerprint(impit::fingerprint::database::chrome_131::fingerprint()), - "chrome136" => builder - .with_fingerprint(impit::fingerprint::database::chrome_136::fingerprint()), - "chrome142" => builder - .with_fingerprint(impit::fingerprint::database::chrome_142::fingerprint()), - "firefox128" | "firefox" => builder - .with_fingerprint(impit::fingerprint::database::firefox_128::fingerprint()), - "firefox133" => builder - .with_fingerprint(impit::fingerprint::database::firefox_133::fingerprint()), - "firefox135" => builder - .with_fingerprint(impit::fingerprint::database::firefox_135::fingerprint()), - "firefox144" => builder - .with_fingerprint(impit::fingerprint::database::firefox_144::fingerprint()), - "okhttp3" => builder - .with_fingerprint(impit::fingerprint::database::okhttp3::fingerprint()), - "okhttp" | "okhttp4" => builder - .with_fingerprint(impit::fingerprint::database::okhttp4::fingerprint()), - "okhttp5" => builder - .with_fingerprint(impit::fingerprint::database::okhttp5::fingerprint()), - "ios18" => builder - .with_fingerprint(impit::fingerprint::database::ios_18::fingerprint()), - _ => { - return Err(PyErr::new::( - "Unsupported browser", - )) - } - }, - None => builder, - }; + let builder = match browser { + Some(browser) => { + builder.with_fingerprint(crate::fingerprint::fingerprint_by_name(&browser)?) + } + None => builder, + }; let builder = match http3 { Some(true) => builder.with_http3(), diff --git a/impit-python/src/client.rs b/impit-python/src/client.rs index ece8bb8d..a817cbfe 100644 --- a/impit-python/src/client.rs +++ b/impit-python/src/client.rs @@ -51,52 +51,15 @@ impl Client { cookies: Option>, headers: Option>, local_address: Option, - ) -> Result { + ) -> PyResult { let builder = ImpitBuilder::default(); - let builder = - match browser { - Some(browser) => match browser.to_lowercase().as_str() { - "chrome" | "chrome125" => builder - .with_fingerprint(impit::fingerprint::database::chrome_125::fingerprint()), - "chrome100" => builder - .with_fingerprint(impit::fingerprint::database::chrome_100::fingerprint()), - "chrome101" => builder - .with_fingerprint(impit::fingerprint::database::chrome_101::fingerprint()), - "chrome104" => builder - .with_fingerprint(impit::fingerprint::database::chrome_104::fingerprint()), - "chrome107" => builder - .with_fingerprint(impit::fingerprint::database::chrome_107::fingerprint()), - "chrome110" => builder - .with_fingerprint(impit::fingerprint::database::chrome_110::fingerprint()), - "chrome116" => builder - .with_fingerprint(impit::fingerprint::database::chrome_116::fingerprint()), - "chrome131" => builder - .with_fingerprint(impit::fingerprint::database::chrome_131::fingerprint()), - "chrome136" => builder - .with_fingerprint(impit::fingerprint::database::chrome_136::fingerprint()), - "chrome142" => builder - .with_fingerprint(impit::fingerprint::database::chrome_142::fingerprint()), - "firefox128" | "firefox" => builder - .with_fingerprint(impit::fingerprint::database::firefox_128::fingerprint()), - "firefox133" => builder - .with_fingerprint(impit::fingerprint::database::firefox_133::fingerprint()), - "firefox135" => builder - .with_fingerprint(impit::fingerprint::database::firefox_135::fingerprint()), - "firefox144" => builder - .with_fingerprint(impit::fingerprint::database::firefox_144::fingerprint()), - "okhttp3" => builder - .with_fingerprint(impit::fingerprint::database::okhttp3::fingerprint()), - "okhttp" | "okhttp4" => builder - .with_fingerprint(impit::fingerprint::database::okhttp4::fingerprint()), - "okhttp5" => builder - .with_fingerprint(impit::fingerprint::database::okhttp5::fingerprint()), - "ios18" => builder - .with_fingerprint(impit::fingerprint::database::ios_18::fingerprint()), - _ => panic!("Unsupported browser"), - }, - None => builder, - }; + let builder = match browser { + Some(browser) => { + builder.with_fingerprint(crate::fingerprint::fingerprint_by_name(&browser)?) + } + None => builder, + }; let builder = match http3 { Some(true) => builder.with_http3(), diff --git a/impit-python/src/fingerprint.rs b/impit-python/src/fingerprint.rs new file mode 100644 index 00000000..19c73a79 --- /dev/null +++ b/impit-python/src/fingerprint.rs @@ -0,0 +1,35 @@ +use impit::fingerprint::{database, BrowserFingerprint}; +use pyo3::exceptions::PyValueError; +use pyo3::PyResult; + +/// Resolves a browser identifier string to its [`BrowserFingerprint`]. +/// +/// Shared by the sync and async clients so the two bindings cannot drift apart. +pub(crate) fn fingerprint_by_name(browser: &str) -> PyResult { + Ok(match browser.to_lowercase().as_str() { + "chrome" | "chrome125" => database::chrome_125::fingerprint(), + "chrome100" => database::chrome_100::fingerprint(), + "chrome101" => database::chrome_101::fingerprint(), + "chrome104" => database::chrome_104::fingerprint(), + "chrome107" => database::chrome_107::fingerprint(), + "chrome110" => database::chrome_110::fingerprint(), + "chrome116" => database::chrome_116::fingerprint(), + "chrome124" => database::chrome_124::fingerprint(), + "chrome131" => database::chrome_131::fingerprint(), + "chrome136" => database::chrome_136::fingerprint(), + "chrome142" => database::chrome_142::fingerprint(), + "firefox" | "firefox128" => database::firefox_128::fingerprint(), + "firefox133" => database::firefox_133::fingerprint(), + "firefox135" => database::firefox_135::fingerprint(), + "firefox144" => database::firefox_144::fingerprint(), + "okhttp3" => database::okhttp3::fingerprint(), + "okhttp" | "okhttp4" => database::okhttp4::fingerprint(), + "okhttp5" => database::okhttp5::fingerprint(), + "ios18" => database::ios_18::fingerprint(), + other => { + return Err(PyValueError::new_err(format!( + "Unsupported browser: {other}" + ))) + } + }) +} diff --git a/impit-python/src/lib.rs b/impit-python/src/lib.rs index 21ff3f1b..9e16af38 100644 --- a/impit-python/src/lib.rs +++ b/impit-python/src/lib.rs @@ -5,6 +5,7 @@ mod async_client; mod client; mod cookies; mod errors; +mod fingerprint; mod request; mod response; @@ -102,10 +103,10 @@ fn impit(_py: Python, m: &Bound<'_, PyModule>) -> PyResult<()> { follow_redirects: Option, max_redirects: Option, proxy: Option, - ) -> Result { + ) -> PyResult { let client = Client::new(_py, None, None, proxy, Some(Right(USE_CLIENT_DEFAULT_SENTINEL)), None, None, follow_redirects, max_redirects, cookie_jar, cookies, None, None); - client?.$name(_py, url, content, data, headers, timeout, force_http3) + Ok(client?.$name(_py, url, content, data, headers, timeout, force_http3)?) } m.add_function(wrap_pyfunction!($name, m)?)?;