Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions tests/expect_continue_test.rs
Original file line number Diff line number Diff line change
@@ -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),
},
}
}
Loading