extern crate tiny_http; use std::net::{TcpStream, Shutdown}; use std::io::{Read, Write}; use std::thread; use std::time::Duration; #[allow(dead_code)] mod support; #[test] fn connection_close_header() { let mut client = support::new_client_to_hello_world_server(); (write!(client, "GET / HTTP/1.1\r\nConnection: keep-alive\r\n\r\n")).unwrap(); thread::sleep(Duration::from_millis(1000)); (write!(client, "GET / HTTP/1.1\r\nConnection: close\r\n\r\n")).unwrap(); // if the connection was not closed, this will err with timeout // client.set_keepalive(Some(1)).unwrap(); FIXME: reenable this let mut out = Vec::new(); client.read_to_end(&mut out).unwrap(); } #[test] fn http_1_0_connection_close() { let mut client = support::new_client_to_hello_world_server(); (write!(client, "GET / HTTP/1.0\r\nHost: localhost\r\n\r\n")).unwrap(); // if the connection was not closed, this will err with timeout // client.set_keepalive(Some(1)).unwrap(); FIXME: reenable this let mut out = Vec::new(); client.read_to_end(&mut out).unwrap(); } #[test] fn detect_connection_closed() { let mut client = support::new_client_to_hello_world_server(); (write!(client, "GET / HTTP/1.1\r\nConnection: keep-alive\r\n\r\n")).unwrap(); thread::sleep(Duration::from_millis(1000)); client.shutdown(Shutdown::Write).unwrap(); // if the connection was not closed, this will err with timeout // client.set_keepalive(Some(1)).unwrap(); FIXME: reenable this let mut out = Vec::new(); client.read_to_end(&mut out).unwrap(); } #[test] fn poor_network_test() { let mut client = support::new_client_to_hello_world_server(); (write!(client, "G")).unwrap(); thread::sleep(Duration::from_millis(100)); (write!(client, "ET /he")).unwrap(); thread::sleep(Duration::from_millis(100)); (write!(client, "llo HT")).unwrap(); thread::sleep(Duration::from_millis(100)); (write!(client, "TP/1.")).unwrap(); thread::sleep(Duration::from_millis(100)); (write!(client, "1\r\nHo")).unwrap(); thread::sleep(Duration::from_millis(100)); (write!(client, "st: localho")).unwrap(); thread::sleep(Duration::from_millis(100)); (write!(client, "st\r\nConnec")).unwrap(); thread::sleep(Duration::from_millis(100)); (write!(client, "tion: close\r")).unwrap(); thread::sleep(Duration::from_millis(100)); (write!(client, "\n\r")).unwrap(); thread::sleep(Duration::from_millis(100)); (write!(client, "\n")).unwrap(); // client.set_keepalive(Some(2)).unwrap(); FIXME: reenable this let mut data = String::new(); client.read_to_string(&mut data).unwrap(); assert!(data.ends_with("hello world")); } #[test] fn pipelining_test() { let mut client = support::new_client_to_hello_world_server(); (write!(client, "GET / HTTP/1.1\r\nHost: localhost\r\n\r\n")).unwrap(); (write!(client, "GET /hello HTTP/1.1\r\nHost: localhost\r\n\r\n")).unwrap(); (write!(client, "GET /world HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n")).unwrap(); // client.set_keepalive(Some(2)).unwrap(); FIXME: reenable this let mut data = String::new(); client.read_to_string(&mut data).unwrap(); assert_eq!(data.split("hello world").count(), 4); } #[test] fn server_crash_results_in_response() { let server = tiny_http::Server::http("0.0.0.0:0").unwrap(); let port = server.server_addr().port(); let mut client = TcpStream::connect(("127.0.0.1", port)).unwrap(); thread::spawn(move || { server.recv().unwrap(); // oops, server crash }); (write!(client, "GET / HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n")).unwrap(); // client.set_keepalive(Some(2)).unwrap(); FIXME: reenable this let mut content = String::new(); client.read_to_string(&mut content).unwrap(); assert!(&content[9..].starts_with("5")); // 5xx status code } #[test] fn responses_reordered() { let (server, mut client) = support::new_one_server_one_client(); (write!(client, "GET / HTTP/1.1\r\nHost: localhost\r\n\r\n")).unwrap(); (write!(client, "GET / HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n")).unwrap(); thread::spawn(move || { let rq1 = server.recv().unwrap(); let rq2 = server.recv().unwrap(); thread::spawn(move || { rq2.respond(tiny_http::Response::from_string(format!("second request"))).unwrap(); }); thread::sleep(Duration::from_millis(100)); thread::spawn(move || { rq1.respond(tiny_http::Response::from_string(format!("first request"))).unwrap(); }); }); // client.set_keepalive(Some(2)).unwrap(); FIXME: reenable this let mut content = String::new(); client.read_to_string(&mut content).unwrap(); assert!(content.ends_with("second request")); } /* FIXME: uncomment and fix #[test] fn connection_timeout() { let (server, mut client) = { let server = tiny_http::ServerBuilder::new() .with_client_connections_timeout(3000) .with_random_port().build().unwrap(); let port = server.server_addr().port(); let client = TcpStream::connect(("127.0.0.1", port)).unwrap(); (server, client) }; let (tx_stop, rx_stop) = mpsc::channel(); // executing server in parallel thread::spawn(move || { loop { server.try_recv(); thread::sleep(Duration::from_millis(100)); if rx_stop.try_recv().is_ok() { break } } }); // waiting for the 408 response let mut content = String::new(); client.read_to_string(&mut content).unwrap(); assert!(&content[9..].starts_with("408")); // stopping server tx_stop.send(()); } */ #[test] fn chunked_threshold() { let resp = tiny_http::Response::from_string("test".to_string()); assert_eq!(resp.chunked_threshold(), 32768); assert_eq!(resp.with_chunked_threshold(42).chunked_threshold(), 42); }