From d1727104c7b2bb9715ce971fe7fd1162f3cf2363 Mon Sep 17 00:00:00 2001 From: Thiago Arrais Date: Wed, 9 Dec 2020 13:58:15 -0300 Subject: [PATCH] tests for following redirects --- awc/src/connect.rs | 5 +--- awc/tests/test_connector.rs | 55 ++++++++++++++++++++++++++++++++++++- 2 files changed, 55 insertions(+), 5 deletions(-) diff --git a/awc/src/connect.rs b/awc/src/connect.rs index 4b5f130e8..97674ef0b 100644 --- a/awc/src/connect.rs +++ b/awc/src/connect.rs @@ -142,13 +142,10 @@ where Ok((resphead, payload)) => { if_chain! { if resphead.status.is_redirection(); + if redirect_count < max_redirects; if let Some(location_value) = resphead.headers.get(actix_http::http::header::LOCATION); if let Ok(location_str) = location_value.to_str(); then { - if redirect_count >= max_redirects { - // TODO: need a better error - return Err(SendRequestError::Timeout); - } if resphead.status == actix_http::http::StatusCode::SEE_OTHER { reqhead.method = actix_http::http::Method::GET; reqbody = Body::None; diff --git a/awc/tests/test_connector.rs b/awc/tests/test_connector.rs index 888f7a900..35e8c9b9d 100644 --- a/awc/tests/test_connector.rs +++ b/awc/tests/test_connector.rs @@ -3,7 +3,9 @@ use actix_http::HttpService; use actix_http_test::test_server; use actix_service::{map_config, ServiceFactory}; use actix_web::http::Version; -use actix_web::{dev::AppConfig, web, App, HttpResponse}; +use actix_web::{dev::AppConfig, test, web, App, HttpResponse}; +use awc::http::StatusCode; +use bytes::Bytes; use open_ssl::ssl::{SslAcceptor, SslConnector, SslFiletype, SslMethod, SslVerifyMode}; fn ssl_acceptor() -> SslAcceptor { @@ -58,3 +60,54 @@ async fn test_connection_window_size() { assert!(response.status().is_success()); assert_eq!(response.version(), Version::HTTP_2); } + +#[actix_rt::test] +async fn test_follow_redirects() { + let srv = test::start(|| { + App::new() + .service(web::resource("/do/redirect").route(web::to(|| { + HttpResponse::TemporaryRedirect() + .header("Location", "get") + .finish() + }))) + .service(web::resource("/do/get").route(web::to(HttpResponse::Ok))) + }); + + let client = awc::Client::builder().finish(); + + let request = client.get(srv.url("/do/redirect")).send(); + let response = request.await.unwrap(); + assert!(response.status().is_success()); + assert_eq!(response.status(), StatusCode::OK); +} + +#[actix_rt::test] +async fn test_max_redirects() { + let srv = test::start(|| { + App::new() + .service(web::resource("/first-redirect").route(web::to(|| { + HttpResponse::TemporaryRedirect() + .header("Location", "/second-redirect") + .body("first") + }))) + .service(web::resource("/second-redirect").route(web::to(|| { + HttpResponse::TemporaryRedirect() + .header("Location", "/third-redirect") + .body("second") + }))) + .service(web::resource("/third-redirect").route(web::to(|| { + HttpResponse::TemporaryRedirect() + .header("Location", "/the-content") + .body("third") + }))) + .service(web::resource("/the-content").route(web::to(HttpResponse::Ok))) + }); + + let client = awc::Client::builder().max_redirects(2).finish(); + + let request = client.get(srv.url("/first-redirect")).send(); + let mut response = request.await.unwrap(); + assert!(response.status().is_redirection()); + assert_eq!(response.status(), StatusCode::TEMPORARY_REDIRECT); + assert_eq!(response.body().await.unwrap(), Bytes::from("third")); +}