leyline-http 0.1.5

HTTP client that impersonates Chrome, Firefox, and Safari on the wire: TLS (JA3/JA4), HTTP/2, and HTTP/3 fingerprints
Documentation
use super::{apply_socket_config, nonblocking_connect_started};
use crate::core::SocketConfig;

#[test]
fn default_keepalive_retries_never_fatal_under_strict() {
    let socket = socket2::Socket::new(socket2::Domain::IPV4, socket2::Type::STREAM, None).unwrap();
    let config = SocketConfig {
        strict: true,
        ..SocketConfig::default()
    };
    assert!(config.tcp_keepalive_retries.is_some());
    apply_socket_config(&socket, &config).expect("expected Ok");
}

#[cfg(any(target_os = "linux", target_os = "android"))]
#[test]
fn tcp_user_timeout_reads_back() {
    let socket = socket2::Socket::new(socket2::Domain::IPV4, socket2::Type::STREAM, None).unwrap();
    let timeout = std::time::Duration::from_secs(7);
    let config = SocketConfig {
        tcp_user_timeout: Some(timeout),
        ..SocketConfig::default()
    };
    apply_socket_config(&socket, &config).unwrap();
    assert_eq!(socket.tcp_user_timeout().unwrap(), Some(timeout));
}

#[cfg(not(any(target_os = "linux", target_os = "android")))]
#[test]
fn tcp_user_timeout_unsupported_errors_under_strict() {
    let socket = socket2::Socket::new(socket2::Domain::IPV4, socket2::Type::STREAM, None).unwrap();
    let config = SocketConfig {
        strict: true,
        tcp_user_timeout: Some(std::time::Duration::from_secs(7)),
        ..SocketConfig::default()
    };
    let err = apply_socket_config(&socket, &config).unwrap_err();
    assert_eq!(err.kind(), std::io::ErrorKind::Unsupported);
}

#[test]
fn accepts_would_block_kind() {
    let err = std::io::Error::from(std::io::ErrorKind::WouldBlock);
    assert!(nonblocking_connect_started(&err));
}

#[test]
fn rejects_unrelated_connect_error() {
    let err = std::io::Error::from(std::io::ErrorKind::ConnectionRefused);
    assert!(!nonblocking_connect_started(&err));
}

#[cfg(unix)]
#[test]
fn accepts_unix_einprogress() {
    let err = std::io::Error::from_raw_os_error(libc::EINPROGRESS);
    assert!(nonblocking_connect_started(&err));
}

#[cfg(windows)]
#[test]
fn accepts_windows_wsaewouldblock() {
    let err = std::io::Error::from_raw_os_error(10035);
    assert!(nonblocking_connect_started(&err));
}

#[cfg(windows)]
#[test]
fn accepts_windows_wsaeinprogress() {
    let err = std::io::Error::from_raw_os_error(10036);
    assert!(nonblocking_connect_started(&err));
}