#![cfg(feature = "fetch")]
#[path = "render/common.rs"]
mod common;
use common::*;
use std::io::Write;
use std::net::TcpListener;
use std::sync::Arc;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::mpsc;
use std::time::Duration;
#[test]
fn oversize_streamed_body_is_cut_off_not_buffered() {
unsafe {
std::env::set_var("MARKDOWN2PDF_ALLOW_PRIVATE_NETWORK", "1");
}
const TARGET_BYTES: usize = 80 * 1024 * 1024;
let listener = TcpListener::bind("127.0.0.1:0").expect("bind local listener");
let addr = listener.local_addr().expect("local addr");
let written_bytes = Arc::new(AtomicUsize::new(0));
let written_bytes_writer = Arc::clone(&written_bytes);
let (done_tx, done_rx) = mpsc::channel();
let handle = std::thread::spawn(move || {
if let Ok((mut stream, _)) = listener.accept() {
let mut discard = [0u8; 1024];
let _ = std::io::Read::read(&mut stream, &mut discard);
let header = b"HTTP/1.1 200 OK\r\nContent-Type: image/png\r\n\r\n";
if stream.write_all(header).is_err() {
let _ = done_tx.send(());
return;
}
let chunk = vec![0u8; 64 * 1024];
let mut written = 0usize;
while written < TARGET_BYTES {
if stream.write_all(&chunk).is_err() {
break;
}
written += chunk.len();
written_bytes_writer.store(written, Ordering::SeqCst);
}
}
let _ = done_tx.send(());
});
let md = format!(
"\n",
addr.ip(),
addr.port()
);
let bytes = render(&md, "");
assert!(pdf_well_formed(&bytes), "PDF not well-formed");
assert!(
contains_text(&bytes, "[image: OVERSIZE]"),
"oversize body should have been rejected, falling back to alt text"
);
let _ = done_rx.recv_timeout(Duration::from_secs(15));
let _ = handle.join();
let written = written_bytes.load(Ordering::SeqCst);
assert!(
written < TARGET_BYTES / 2,
"server was allowed to write {written} of {TARGET_BYTES} target bytes — \
the size cap did not cut the connection off"
);
unsafe {
std::env::remove_var("MARKDOWN2PDF_ALLOW_PRIVATE_NETWORK");
}
}