add test case for h2c connector

This commit is contained in:
Rob Ede 2021-11-22 17:46:42 +00:00
parent 1b7a79719e
commit aa1526eed2
No known key found for this signature in database
GPG Key ID: 97C636207D3EF933
4 changed files with 51 additions and 14 deletions

View File

@ -21,16 +21,15 @@ use http::Method;
use socket2::{Domain, Protocol, Socket, Type}; use socket2::{Domain, Protocol, Socket, Type};
use tokio::sync::mpsc; use tokio::sync::mpsc;
/// Start test server /// Start test server.
/// ///
/// `TestServer` is very simple test server that simplify process of writing /// `TestServer` is very simple test server that simplify process of writing integration tests cases
/// integration tests cases for actix web applications. /// for HTTP applications.
/// ///
/// # Examples /// # Examples
/// /// ```no_run
/// ```
/// use actix_http::HttpService; /// use actix_http::HttpService;
/// use actix_http_test::TestServer; /// use actix_http_test::test_server;
/// use actix_web::{web, App, HttpResponse, Error}; /// use actix_web::{web, App, HttpResponse, Error};
/// ///
/// async fn my_handler() -> Result<HttpResponse, Error> { /// async fn my_handler() -> Result<HttpResponse, Error> {
@ -39,10 +38,9 @@ use tokio::sync::mpsc;
/// ///
/// #[actix_web::test] /// #[actix_web::test]
/// async fn test_example() { /// async fn test_example() {
/// let mut srv = TestServer::start( /// let mut srv = TestServer::start(||
/// || HttpService::new( /// HttpService::new(
/// App::new().service( /// App::new().service(web::resource("/").to(my_handler))
/// web::resource("/").to(my_handler))
/// ) /// )
/// ); /// );
/// ///

View File

@ -67,9 +67,9 @@ impl Connector<()> {
> + Clone, > + Clone,
> { > {
Connector { Connector {
ssl: Self::build_ssl(vec![b"h2".to_vec(), b"http/1.1".to_vec()]),
connector: new_connector(resolver::resolver()), connector: new_connector(resolver::resolver()),
config: ConnectorConfig::default(), config: ConnectorConfig::default(),
ssl: Self::build_ssl(vec![b"h2".to_vec(), b"http/1.1".to_vec()]),
} }
} }
@ -189,7 +189,7 @@ where
http::Version::HTTP_11 => vec![b"http/1.1".to_vec()], http::Version::HTTP_11 => vec![b"http/1.1".to_vec()],
http::Version::HTTP_2 => vec![b"h2".to_vec(), b"http/1.1".to_vec()], http::Version::HTTP_2 => vec![b"h2".to_vec(), b"http/1.1".to_vec()],
_ => { _ => {
unimplemented!("actix-http:client: supported versions http/1.1, http/2") unimplemented!("actix-http client only supports versions http/1.1 & http/2")
} }
}; };
self.ssl = Connector::build_ssl(versions); self.ssl = Connector::build_ssl(versions);
@ -816,3 +816,42 @@ mod resolver {
}) })
} }
} }
#[cfg(feature = "dangerous-h2c")]
#[cfg(test)]
mod tests {
use std::convert::Infallible;
use actix_http::{HttpService, Request, Response, Version};
use actix_http_test::test_server;
use actix_service::ServiceFactoryExt as _;
use super::*;
use crate::Client;
#[actix_rt::test]
async fn h2c_connector() {
let mut srv = test_server(|| {
HttpService::build()
.h2(|_req: Request| async { Ok::<_, Infallible>(Response::ok()) })
.tcp()
.map_err(|_| ())
})
.await;
let connector = Connector {
connector: new_connector(resolver::resolver()),
config: ConnectorConfig::default(),
ssl: SslConnector::None,
};
let client = Client::builder().connector(connector).finish();
let request = client.get(srv.surl("/")).send();
let response = request.await.unwrap();
assert!(response.status().is_success());
assert_eq!(response.version(), Version::HTTP_2);
srv.stop().await;
}
}

View File

@ -115,10 +115,10 @@ impl ClientRequest {
&self.head.method &self.head.method
} }
#[doc(hidden)]
/// Set HTTP version of this request. /// Set HTTP version of this request.
/// ///
/// By default requests's HTTP version depends on network stream /// By default requests's HTTP version depends on network stream
#[doc(hidden)]
#[inline] #[inline]
pub fn version(mut self, version: Version) -> Self { pub fn version(mut self, version: Version) -> Self {
self.head.version = version; self.head.version = version;

View File

@ -39,7 +39,7 @@ fn tls_config() -> SslAcceptor {
#[actix_rt::test] #[actix_rt::test]
async fn test_connection_window_size() { async fn test_connection_window_size() {
let srv = test_server(move || { let srv = test_server(|| {
HttpService::build() HttpService::build()
.h2(map_config( .h2(map_config(
App::new().service(web::resource("/").route(web::to(HttpResponse::Ok))), App::new().service(web::resource("/").route(web::to(HttpResponse::Ok))),