use http::{header, StatusCode};
use plane_dynamic_proxy::{
https_redirect::HttpsRedirectService,
server::{HttpsConfig, SimpleHttpServer},
};
use reqwest::{Response, Url};
use std::net::{IpAddr, SocketAddr};
use tokio::net::TcpListener;
const DOMAIN: &str = "foo.bar.baz";
fn get_client() -> reqwest::Client {
reqwest::Client::builder()
.redirect(reqwest::redirect::Policy::none())
.resolve(DOMAIN, SocketAddr::new(IpAddr::from([127, 0, 0, 1]), 0))
.build()
.unwrap()
}
async fn do_request(url: &str) -> Response {
let listener = TcpListener::bind("127.0.0.1:0").await.unwrap();
let port = listener.local_addr().unwrap().port();
let https_config = HttpsConfig::http();
let _server = SimpleHttpServer::new(HttpsRedirectService, listener, https_config);
let mut url = Url::parse(url).unwrap();
url.set_port(Some(port)).unwrap();
get_client().get(url).send().await.unwrap()
}
#[tokio::test]
async fn test_https_redirect() {
let response = do_request("http://foo.bar.baz").await;
assert_eq!(response.status(), StatusCode::MOVED_PERMANENTLY);
assert_eq!(
response.headers().get(header::LOCATION).unwrap(),
"https://foo.bar.baz/"
);
}
#[tokio::test]
async fn test_https_redirect_with_slash_path() {
let response = do_request("http://foo.bar.baz/").await;
assert_eq!(response.status(), StatusCode::MOVED_PERMANENTLY);
assert_eq!(
response.headers().get(header::LOCATION).unwrap(),
"https://foo.bar.baz/"
);
}
#[tokio::test]
async fn test_https_redirect_with_path() {
let response = do_request("http://foo.bar.baz/abc/123").await;
assert_eq!(response.status(), StatusCode::MOVED_PERMANENTLY);
assert_eq!(
response.headers().get(header::LOCATION).unwrap(),
"https://foo.bar.baz/abc/123"
);
}
#[tokio::test]
async fn test_https_redirect_with_query_params() {
let response = do_request("http://foo.bar.baz/?a=1&b=2").await;
assert_eq!(response.status(), StatusCode::MOVED_PERMANENTLY);
assert_eq!(
response.headers().get(header::LOCATION).unwrap(),
"https://foo.bar.baz/?a=1&b=2"
);
}