hpx-emulation 2.4.7

Browser emulation profiles for hpx (TLS fingerprinting, HTTP/2 settings)
Documentation
#![allow(dead_code)]
pub mod delay_layer;
pub mod delay_server;
pub mod server;

use std::{sync::LazyLock, time::Duration};

use hpx::Client;
use tokio::sync::Semaphore;

// TODO: remove once done converting to new support server?
#[allow(unused)]
pub static DEFAULT_USER_AGENT: &str =
    concat!(env!("CARGO_PKG_NAME"), "/", env!("CARGO_PKG_VERSION"));

pub static TEST_SEMAPHORE: LazyLock<Semaphore> = LazyLock::new(|| Semaphore::new(1));

pub static CLIENT: LazyLock<Client> = LazyLock::new(|| {
    Client::builder()
        .connect_timeout(Duration::from_secs(60))
        .build()
        .unwrap()
});

#[allow(unused_macros)]
macro_rules! test_emulation {
    ($test_name:ident, $emulation:expr, $ja4:expr, $akamai_hash:expr) => {
        #[tokio::test]
        async fn $test_name() {
            if std::env::var("HPX_NETWORK_TESTS").is_err() {
                eprintln!(
                    "skipping {}: set HPX_NETWORK_TESTS=1 to run network emulation tests",
                    stringify!($test_name)
                );
                return;
            }
            let _permit = crate::support::TEST_SEMAPHORE.acquire().await.unwrap();

            let resp = crate::support::CLIENT
                .get("https://tls.peet.ws/api/all")
                .emulation($emulation)
                .send()
                .await
                .unwrap();

            assert_eq!(resp.status(), hpx::StatusCode::OK);
            let content = resp.text().await.unwrap();

            let conditional = $ja4.iter().any(|&ja4| content.contains(ja4));
            if !conditional {
                println!("{}", content);
            }
            assert!(conditional);

            let conditional = content.contains($akamai_hash);
            if !conditional {
                println!("{}", content);
            }
            assert!(conditional);

            tokio::time::sleep(std::time::Duration::from_millis(1000)).await;
        }
    };
}