#![cfg(feature = "integration-tests")]
use std::io::{BufRead, BufReader, Write};
use std::net::TcpListener;
use std::sync::mpsc;
use serial_test::serial;
use zendriver::Browser;
use zendriver::stealth::StealthProfile;
#[tokio::test]
#[serial]
#[ignore] async fn pinned_chrome_major_leaks_binary_accept_encoding() {
let listener = TcpListener::bind("127.0.0.1:0").expect("bind");
let port = listener.local_addr().unwrap().port();
let (tx, rx) = mpsc::channel::<Vec<String>>();
std::thread::spawn(move || {
if let Ok((stream, _)) = listener.accept() {
let mut reader = BufReader::new(&stream);
let mut headers = Vec::new();
loop {
let mut line = String::new();
if reader.read_line(&mut line).unwrap_or(0) == 0 {
break;
}
if line == "\r\n" {
break;
}
headers.push(line.trim_end().to_string());
}
let mut w = &stream;
let _ =
w.write_all(b"HTTP/1.1 200 OK\r\nContent-Length: 2\r\nConnection: close\r\n\r\nok");
let _ = tx.send(headers);
}
});
let profile = StealthProfile::spoofed().chrome_version(120);
let browser = Browser::builder()
.stealth(profile)
.headless(true)
.launch()
.await
.expect("launch");
let tab = browser.main_tab();
let _ = tab.goto(format!("http://127.0.0.1:{port}/")).await;
let headers = rx
.recv_timeout(std::time::Duration::from_secs(20))
.expect("server saw a request");
let ae: Vec<&String> = headers
.iter()
.filter(|h| h.to_ascii_lowercase().starts_with("accept-encoding:"))
.collect();
assert_eq!(
ae.len(),
1,
"expected one Accept-Encoding header, got {ae:?}"
);
assert!(
ae[0].to_ascii_lowercase().contains("zstd"),
"expected the >=123 binary to leak `zstd` despite the claimed major; \
got {ae:?} (is this Chrome older than 123?)",
);
browser.close().await.ok();
}