diff --git a/CHANGES.md b/CHANGES.md index e8389910..39975fb4 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,12 @@ # Changes +### Changed + +* Renamed `TestRequest::to_service()` to `TestRequest::to_srv_request()` + +* Renamed `TestRequest::to_response()` to `TestRequest::to_srv_response()` + + ### Removed * Removed unused `actix_web::web::md()` diff --git a/src/middleware/cors.rs b/src/middleware/cors.rs index 2ece543d..8924eb0a 100644 --- a/src/middleware/cors.rs +++ b/src/middleware/cors.rs @@ -848,8 +848,8 @@ mod tests { #[test] fn validate_origin_allows_all_origins() { let mut cors = Cors::new().finish(test::ok_service()); - let req = - TestRequest::with_header("Origin", "https://www.example.com").to_service(); + let req = TestRequest::with_header("Origin", "https://www.example.com") + .to_srv_request(); let resp = test::call_success(&mut cors, req); assert_eq!(resp.status(), StatusCode::OK); @@ -867,7 +867,7 @@ mod tests { let req = TestRequest::with_header("Origin", "https://www.example.com") .method(Method::OPTIONS) - .to_service(); + .to_srv_request(); assert!(cors.inner.validate_allowed_method(&req).is_err()); assert!(cors.inner.validate_allowed_headers(&req).is_err()); @@ -877,7 +877,7 @@ mod tests { let req = TestRequest::with_header("Origin", "https://www.example.com") .header(header::ACCESS_CONTROL_REQUEST_METHOD, "put") .method(Method::OPTIONS) - .to_service(); + .to_srv_request(); assert!(cors.inner.validate_allowed_method(&req).is_err()); assert!(cors.inner.validate_allowed_headers(&req).is_err()); @@ -889,7 +889,7 @@ mod tests { "AUTHORIZATION,ACCEPT", ) .method(Method::OPTIONS) - .to_service(); + .to_srv_request(); let resp = test::call_success(&mut cors, req); assert_eq!( @@ -935,7 +935,7 @@ mod tests { "AUTHORIZATION,ACCEPT", ) .method(Method::OPTIONS) - .to_service(); + .to_srv_request(); let resp = test::call_success(&mut cors, req); assert_eq!(resp.status(), StatusCode::OK); @@ -960,7 +960,7 @@ mod tests { let req = TestRequest::with_header("Origin", "https://www.unknown.com") .method(Method::GET) - .to_service(); + .to_srv_request(); cors.inner.validate_origin(&req).unwrap(); cors.inner.validate_allowed_method(&req).unwrap(); cors.inner.validate_allowed_headers(&req).unwrap(); @@ -974,7 +974,7 @@ mod tests { let req = TestRequest::with_header("Origin", "https://www.example.com") .method(Method::GET) - .to_service(); + .to_srv_request(); let resp = test::call_success(&mut cors, req); assert_eq!(resp.status(), StatusCode::OK); @@ -984,7 +984,7 @@ mod tests { fn test_no_origin_response() { let mut cors = Cors::new().disable_preflight().finish(test::ok_service()); - let req = TestRequest::default().method(Method::GET).to_service(); + let req = TestRequest::default().method(Method::GET).to_srv_request(); let resp = test::call_success(&mut cors, req); assert!(resp .headers() @@ -993,7 +993,7 @@ mod tests { let req = TestRequest::with_header("Origin", "https://www.example.com") .method(Method::OPTIONS) - .to_service(); + .to_srv_request(); let resp = test::call_success(&mut cors, req); assert_eq!( &b"https://www.example.com"[..], @@ -1019,7 +1019,7 @@ mod tests { let req = TestRequest::with_header("Origin", "https://www.example.com") .method(Method::OPTIONS) - .to_service(); + .to_srv_request(); let resp = test::call_success(&mut cors, req); assert_eq!( @@ -1066,7 +1066,7 @@ mod tests { })); let req = TestRequest::with_header("Origin", "https://www.example.com") .method(Method::OPTIONS) - .to_service(); + .to_srv_request(); let resp = test::call_success(&mut cors, req); assert_eq!( &b"Accept, Origin"[..], @@ -1082,7 +1082,7 @@ mod tests { let req = TestRequest::with_header("Origin", "https://www.example.com") .method(Method::OPTIONS) .header(header::ACCESS_CONTROL_REQUEST_METHOD, "POST") - .to_service(); + .to_srv_request(); let resp = test::call_success(&mut cors, req); let origins_str = resp @@ -1105,7 +1105,7 @@ mod tests { let req = TestRequest::with_header("Origin", "https://example.com") .method(Method::GET) - .to_service(); + .to_srv_request(); let resp = test::call_success(&mut cors, req); assert_eq!( @@ -1118,7 +1118,7 @@ mod tests { let req = TestRequest::with_header("Origin", "https://example.org") .method(Method::GET) - .to_service(); + .to_srv_request(); let resp = test::call_success(&mut cors, req); assert_eq!( @@ -1141,7 +1141,7 @@ mod tests { let req = TestRequest::with_header("Origin", "https://example.com") .header(header::ACCESS_CONTROL_REQUEST_METHOD, "GET") .method(Method::OPTIONS) - .to_service(); + .to_srv_request(); let resp = test::call_success(&mut cors, req); assert_eq!( @@ -1155,7 +1155,7 @@ mod tests { let req = TestRequest::with_header("Origin", "https://example.org") .header(header::ACCESS_CONTROL_REQUEST_METHOD, "GET") .method(Method::OPTIONS) - .to_service(); + .to_srv_request(); let resp = test::call_success(&mut cors, req); assert_eq!( diff --git a/src/middleware/defaultheaders.rs b/src/middleware/defaultheaders.rs index ca5b8f80..72e866db 100644 --- a/src/middleware/defaultheaders.rs +++ b/src/middleware/defaultheaders.rs @@ -166,11 +166,11 @@ mod tests { ) .unwrap(); - let req = TestRequest::default().to_service(); + let req = TestRequest::default().to_srv_request(); let resp = block_on(mw.call(req)).unwrap(); assert_eq!(resp.headers().get(CONTENT_TYPE).unwrap(), "0001"); - let req = TestRequest::default().to_service(); + let req = TestRequest::default().to_srv_request(); let srv = FnService::new(|req: ServiceRequest<_>| { req.into_response(HttpResponse::Ok().header(CONTENT_TYPE, "0002").finish()) }); @@ -192,7 +192,7 @@ mod tests { let mut mw = block_on(DefaultHeaders::new().content_type().new_transform(srv)).unwrap(); - let req = TestRequest::default().to_service(); + let req = TestRequest::default().to_srv_request(); let resp = block_on(mw.call(req)).unwrap(); assert_eq!( resp.headers().get(CONTENT_TYPE).unwrap(), diff --git a/src/middleware/errhandlers.rs b/src/middleware/errhandlers.rs index 4f253722..a69bdaf9 100644 --- a/src/middleware/errhandlers.rs +++ b/src/middleware/errhandlers.rs @@ -180,7 +180,7 @@ mod tests { ) .unwrap(); - let resp = test::call_success(&mut mw, TestRequest::default().to_service()); + let resp = test::call_success(&mut mw, TestRequest::default().to_srv_request()); assert_eq!(resp.headers().get(CONTENT_TYPE).unwrap(), "0001"); } @@ -206,7 +206,7 @@ mod tests { ) .unwrap(); - let resp = test::call_success(&mut mw, TestRequest::default().to_service()); + let resp = test::call_success(&mut mw, TestRequest::default().to_srv_request()); assert_eq!(resp.headers().get(CONTENT_TYPE).unwrap(), "0001"); } } diff --git a/src/middleware/logger.rs b/src/middleware/logger.rs index cd52048f..d9c9b138 100644 --- a/src/middleware/logger.rs +++ b/src/middleware/logger.rs @@ -469,44 +469,40 @@ mod tests { header::USER_AGENT, header::HeaderValue::from_static("ACTIX-WEB"), ) - .to_service(); + .to_srv_request(); let _res = block_on(srv.call(req)); } - // #[test] - // fn test_default_format() { - // let format = Format::default(); + #[test] + fn test_default_format() { + let mut format = Format::default(); - // let req = TestRequest::with_header( - // header::USER_AGENT, - // header::HeaderValue::from_static("ACTIX-WEB"), - // ) - // .finish(); - // let resp = HttpResponse::build(StatusCode::OK).force_close().finish(); - // let entry_time = time::now(); + let req = TestRequest::with_header( + header::USER_AGENT, + header::HeaderValue::from_static("ACTIX-WEB"), + ) + .to_srv_request(); - // let render = |fmt: &mut Formatter| { - // for unit in &format.0 { - // unit.render(fmt, &req, &resp, entry_time)?; - // } - // Ok(()) - // }; - // let s = format!("{}", FormatDisplay(&render)); - // assert!(s.contains("GET / HTTP/1.1")); - // assert!(s.contains("200 0")); - // assert!(s.contains("ACTIX-WEB")); + let now = time::now(); + for unit in &mut format.0 { + unit.render_request(now, &req); + } - // let req = TestRequest::with_uri("/?test").finish(); - // let resp = HttpResponse::build(StatusCode::OK).force_close().finish(); - // let entry_time = time::now(); + let resp = HttpResponse::build(StatusCode::OK).force_close().finish(); + for unit in &mut format.0 { + unit.render_response(&resp); + } - // let render = |fmt: &mut Formatter| { - // for unit in &format.0 { - // unit.render(fmt, &req, &resp, entry_time)?; - // } - // Ok(()) - // }; - // let s = format!("{}", FormatDisplay(&render)); - // assert!(s.contains("GET /?test HTTP/1.1")); - // } + let entry_time = time::now(); + let render = |fmt: &mut Formatter| { + for unit in &format.0 { + unit.render(fmt, 1024, entry_time)?; + } + Ok(()) + }; + let s = format!("{}", FormatDisplay(&render)); + assert!(s.contains("GET / HTTP/1.1")); + assert!(s.contains("200 1024")); + assert!(s.contains("ACTIX-WEB")); + } } diff --git a/src/service.rs b/src/service.rs index 5a042208..c260f25b 100644 --- a/src/service.rs +++ b/src/service.rs @@ -449,3 +449,30 @@ impl fmt::Debug for ServiceResponse { res } } + +#[cfg(test)] +mod tests { + use crate::test::TestRequest; + use crate::HttpResponse; + + #[test] + fn test_fmt_debug() { + let req = TestRequest::get() + .uri("/index.html?test=1") + .header("x-test", "111") + .to_srv_request(); + let s = format!("{:?}", req); + assert!(s.contains("ServiceRequest")); + assert!(s.contains("test=1")); + assert!(s.contains("x-test")); + + let res = HttpResponse::Ok().header("x-test", "111").finish(); + let res = TestRequest::post() + .uri("/index.html?test=1") + .to_srv_response(res); + + let s = format!("{:?}", res); + assert!(s.contains("ServiceResponse")); + assert!(s.contains("x-test")); + } +} diff --git a/src/test.rs b/src/test.rs index f18fc2b3..209edac5 100644 --- a/src/test.rs +++ b/src/test.rs @@ -320,7 +320,7 @@ impl TestRequest { } /// Complete request creation and generate `ServiceRequest` instance - pub fn to_service(mut self) -> ServiceRequest { + pub fn to_srv_request(mut self) -> ServiceRequest { let req = self.req.finish(); ServiceRequest::new( @@ -331,16 +331,16 @@ impl TestRequest { ) } + /// Complete request creation and generate `ServiceResponse` instance + pub fn to_srv_response(self, res: HttpResponse) -> ServiceResponse { + self.to_srv_request().into_response(res) + } + /// Complete request creation and generate `Request` instance pub fn to_request(mut self) -> Request { self.req.finish() } - /// Complete request creation and generate `ServiceResponse` instance - pub fn to_response(self, res: HttpResponse) -> ServiceResponse { - self.to_service().into_response(res) - } - /// Complete request creation and generate `HttpRequest` instance pub fn to_http_request(mut self) -> HttpRequest { let req = self.req.finish(); diff --git a/tests/test_httpserver.rs b/tests/test_httpserver.rs index bafe578e..dca3377c 100644 --- a/tests/test_httpserver.rs +++ b/tests/test_httpserver.rs @@ -2,8 +2,11 @@ use net2::TcpBuilder; use std::sync::mpsc; use std::{net, thread, time::Duration}; +#[cfg(feature = "ssl")] +use openssl::ssl::SslAcceptorBuilder; + use actix_http::Response; -use actix_web::{web, App, HttpServer}; +use actix_web::{test, web, App, HttpServer}; fn unused_addr() -> net::SocketAddr { let addr: net::SocketAddr = "127.0.0.1:0".parse().unwrap(); @@ -76,3 +79,77 @@ fn test_start() { thread::sleep(Duration::from_millis(100)); let _ = sys.stop(); } + +#[cfg(feature = "ssl")] +fn ssl_acceptor() -> std::io::Result { + use openssl::ssl::{SslAcceptor, SslFiletype, SslMethod}; + // load ssl keys + let mut builder = SslAcceptor::mozilla_intermediate(SslMethod::tls()).unwrap(); + builder + .set_private_key_file("tests/key.pem", SslFiletype::PEM) + .unwrap(); + builder + .set_certificate_chain_file("tests/cert.pem") + .unwrap(); + Ok(builder) +} + +#[test] +#[cfg(feature = "ssl")] +fn test_start_ssl() { + let addr = unused_addr(); + let (tx, rx) = mpsc::channel(); + + thread::spawn(move || { + let sys = actix_rt::System::new("test"); + let builder = ssl_acceptor().unwrap(); + + let srv = HttpServer::new(|| { + App::new().service( + web::resource("/").route(web::to(|| Response::Ok().body("test"))), + ) + }) + .workers(1) + .shutdown_timeout(1) + .system_exit() + .disable_signals() + .bind_ssl(format!("{}", addr), builder) + .unwrap() + .start(); + + let _ = tx.send((srv, actix_rt::System::current())); + let _ = sys.run(); + }); + let (srv, sys) = rx.recv().unwrap(); + + let client = test::run_on(|| { + use openssl::ssl::{SslConnector, SslMethod, SslVerifyMode}; + let mut builder = SslConnector::builder(SslMethod::tls()).unwrap(); + builder.set_verify(SslVerifyMode::NONE); + let _ = builder + .set_alpn_protos(b"\x02h2\x08http/1.1") + .map_err(|e| log::error!("Can not set alpn protocol: {:?}", e)); + + Ok::<_, ()>( + awc::Client::build() + .connector( + awc::Connector::new() + .ssl(builder.build()) + .timeout(Duration::from_millis(100)) + .service(), + ) + .finish(), + ) + }) + .unwrap(); + let host = format!("https://{}", addr); + + let response = test::block_on(client.get(host.clone()).send()).unwrap(); + assert!(response.status().is_success()); + + // stop + let _ = srv.stop(false); + + thread::sleep(Duration::from_millis(100)); + let _ = sys.stop(); +}