diff --git a/tests/expect_continue_test.rs b/tests/expect_continue_test.rs new file mode 100644 index 0000000..160add9 --- /dev/null +++ b/tests/expect_continue_test.rs @@ -0,0 +1,60 @@ +use astra::{Body, Request, Response, Server}; +use std::io::{Read, Write}; +use std::net::TcpStream; +use std::sync::mpsc; +use std::thread; +use std::time::Duration; + +#[test] +#[should_panic(expected = "Expect: 100-continue request failed due to timeout")] +fn test_expect_continue() { + let (tx, rx) = mpsc::channel(); + + thread::spawn(move || { + let server = Server::bind("127.0.0.1:0"); + let addr = server.local_addr().expect("Failed to get local address"); + tx.send(addr).expect("Failed to send address"); + + let _ = server.serve(|mut req: Request, _info| { + let mut body = String::new(); + req.body_mut().reader().read_to_string(&mut body).unwrap(); + Response::new(Body::new("OK")) + }); + }); + + let server_addr = rx + .recv_timeout(Duration::from_secs(5)) + .expect("Failed to receive server address"); + + thread::sleep(Duration::from_millis(200)); + + let mut stream = TcpStream::connect(server_addr).expect("Failed to connect"); + stream + .set_read_timeout(Some(Duration::from_secs(2))) + .unwrap(); + + let request = "POST /test HTTP/1.1\r\n\ + Host: localhost\r\n\ + Content-Length: 5\r\n\ + Expect: 100-continue\r\n\ + \r\n"; + + stream.write_all(request.as_bytes()).unwrap(); + + let mut buffer = [0; 1024]; + match stream.read(&mut buffer) { + Ok(n) => { + let response = String::from_utf8_lossy(&buffer[..n]); + if !response.contains("100 Continue") { + panic!("Expected 100 Continue but got: {}", response); + } + } + Err(_) => match rx.try_recv() { + Err(mpsc::TryRecvError::Empty) => { + panic!("Expect: 100-continue request failed due to timeout"); + } + Ok(_) => panic!("Server completed unexpectedly"), + Err(e) => panic!("Server error: {:?}", e), + }, + } +}