#![cfg(not(target_arch = "wasm32"))] mod support; use reqwest_impersonate as reqwest; use support::server; use std::env; #[tokio::test] async fn http_proxy() { let url = "http://hyper.rs/prox"; let server = server::http(move |req| { assert_eq!(req.method(), "GET"); assert_eq!(req.uri(), url); assert_eq!(req.headers()["host"], "hyper.rs"); async { http::Response::default() } }); let proxy = format!("http://{}", server.addr()); let res = reqwest::Client::builder() .proxy(reqwest::Proxy::http(&proxy).unwrap()) .build() .unwrap() .get(url) .send() .await .unwrap(); assert_eq!(res.url().as_str(), url); assert_eq!(res.status(), reqwest::StatusCode::OK); } #[tokio::test] async fn http_proxy_basic_auth() { let url = "http://hyper.rs/prox"; let server = server::http(move |req| { assert_eq!(req.method(), "GET"); assert_eq!(req.uri(), url); assert_eq!(req.headers()["host"], "hyper.rs"); assert_eq!( req.headers()["proxy-authorization"], "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==" ); async { http::Response::default() } }); let proxy = format!("http://{}", server.addr()); let res = reqwest::Client::builder() .proxy( reqwest::Proxy::http(&proxy) .unwrap() .basic_auth("Aladdin", "open sesame"), ) .build() .unwrap() .get(url) .send() .await .unwrap(); assert_eq!(res.url().as_str(), url); assert_eq!(res.status(), reqwest::StatusCode::OK); } #[tokio::test] async fn http_proxy_basic_auth_parsed() { let url = "http://hyper.rs/prox"; let server = server::http(move |req| { assert_eq!(req.method(), "GET"); assert_eq!(req.uri(), url); assert_eq!(req.headers()["host"], "hyper.rs"); assert_eq!( req.headers()["proxy-authorization"], "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==" ); async { http::Response::default() } }); let proxy = format!("http://Aladdin:open sesame@{}", server.addr()); let res = reqwest::Client::builder() .proxy(reqwest::Proxy::http(&proxy).unwrap()) .build() .unwrap() .get(url) .send() .await .unwrap(); assert_eq!(res.url().as_str(), url); assert_eq!(res.status(), reqwest::StatusCode::OK); } #[tokio::test] async fn system_http_proxy_basic_auth_parsed() { let url = "http://hyper.rs/prox"; let server = server::http(move |req| { assert_eq!(req.method(), "GET"); assert_eq!(req.uri(), url); assert_eq!(req.headers()["host"], "hyper.rs"); assert_eq!( req.headers()["proxy-authorization"], "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==" ); async { http::Response::default() } }); // save system setting first. let system_proxy = env::var("http_proxy"); // set-up http proxy. env::set_var( "http_proxy", format!("http://Aladdin:open sesame@{}", server.addr()), ); let res = reqwest::Client::builder() .build() .unwrap() .get(url) .send() .await .unwrap(); assert_eq!(res.url().as_str(), url); assert_eq!(res.status(), reqwest::StatusCode::OK); // reset user setting. match system_proxy { Err(_) => env::remove_var("http_proxy"), Ok(proxy) => env::set_var("http_proxy", proxy), } } #[tokio::test] async fn test_no_proxy() { let server = server::http(move |req| { assert_eq!(req.method(), "GET"); assert_eq!(req.uri(), "/4"); async { http::Response::default() } }); let proxy = format!("http://{}", server.addr()); let url = format!("http://{}/4", server.addr()); // set up proxy and use no_proxy to clear up client builder proxies. let res = reqwest::Client::builder() .proxy(reqwest::Proxy::http(&proxy).unwrap()) .no_proxy() .build() .unwrap() .get(&url) .send() .await .unwrap(); assert_eq!(res.url().as_str(), &url); assert_eq!(res.status(), reqwest::StatusCode::OK); } #[cfg_attr(not(feature = "__internal_proxy_sys_no_cache"), ignore)] #[tokio::test] async fn test_using_system_proxy() { let url = "http://not.a.real.sub.hyper.rs/prox"; let server = server::http(move |req| { assert_eq!(req.method(), "GET"); assert_eq!(req.uri(), url); assert_eq!(req.headers()["host"], "not.a.real.sub.hyper.rs"); async { http::Response::default() } }); // Note: we're relying on the `__internal_proxy_sys_no_cache` feature to // check the environment every time. // save system setting first. let system_proxy = env::var("http_proxy"); // set-up http proxy. env::set_var("http_proxy", format!("http://{}", server.addr())); // system proxy is used by default let res = reqwest::get(url).await.unwrap(); assert_eq!(res.url().as_str(), url); assert_eq!(res.status(), reqwest::StatusCode::OK); // reset user setting. match system_proxy { Err(_) => env::remove_var("http_proxy"), Ok(proxy) => env::set_var("http_proxy", proxy), } } #[tokio::test] async fn http_over_http() { let url = "http://hyper.rs/prox"; let server = server::http(move |req| { assert_eq!(req.method(), "GET"); assert_eq!(req.uri(), url); assert_eq!(req.headers()["host"], "hyper.rs"); async { http::Response::default() } }); let proxy = format!("http://{}", server.addr()); let res = reqwest::Client::builder() .proxy(reqwest::Proxy::http(&proxy).unwrap()) .build() .unwrap() .get(url) .send() .await .unwrap(); assert_eq!(res.url().as_str(), url); assert_eq!(res.status(), reqwest::StatusCode::OK); }