Skip to content

Commit 65ee65e

Browse files
committed
fix: use Url base_url support for parsing
1 parent 09087ae commit 65ee65e

File tree

2 files changed

+47
-31
lines changed

2 files changed

+47
-31
lines changed

src/async_impl/client.rs

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ use crate::cookie;
3737
use crate::dns::hickory::HickoryDnsResolver;
3838
use crate::dns::{gai::GaiResolver, DnsResolverWithOverrides, DynResolver, Resolve};
3939
use crate::error;
40-
use crate::into_url::try_uri;
40+
use crate::into_url::{try_uri, IntoUrlSealed};
4141
use crate::redirect::{self, remove_sensitive_headers};
4242
#[cfg(feature = "__tls")]
4343
use crate::tls::{self, TlsBackend};
@@ -816,7 +816,7 @@ impl ClientBuilder {
816816
/// base url has been set.
817817
pub fn base_url<U>(mut self, base_url: U) -> ClientBuilder
818818
where
819-
U: IntoUrl
819+
U: IntoUrl,
820820
{
821821
match base_url.into_url() {
822822
Ok(base_url) => {
@@ -1994,25 +1994,14 @@ impl Client {
19941994
///
19951995
/// This method fails whenever the supplied `Url` cannot be parsed.
19961996
pub fn request<U: IntoUrl>(&self, method: Method, url: U) -> RequestBuilder {
1997-
let mut maybe_url = url.into_url();
1998-
1999-
if let Some(base_url) = &self.inner.base_url {
2000-
if let Err(url_parse_error) = &maybe_url {
2001-
if url_parse_error.is_builder() {
2002-
if let Some(url) = url_parse_error.url() {
2003-
if !url.has_host() {
2004-
let mut replacement_url = base_url.clone();
2005-
2006-
replacement_url.set_path(url.path());
2007-
replacement_url.set_query(url.query());
2008-
replacement_url.set_fragment(url.fragment());
2009-
2010-
maybe_url = Ok(replacement_url);
2011-
}
2012-
}
2013-
}
2014-
}
2015-
}
1997+
let maybe_url = match &self.inner.base_url {
1998+
Some(ref base_url) => Url::options()
1999+
.base_url(Some(base_url))
2000+
.parse(url.as_str())
2001+
.map_err(crate::error::builder)
2002+
.and_then(IntoUrlSealed::into_url),
2003+
None => url.into_url(),
2004+
};
20162005

20172006
let req = maybe_url.map(move |url| Request::new(method, url));
20182007
RequestBuilder::new(self.clone(), req)

tests/client.rs

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -574,32 +574,59 @@ async fn highly_concurrent_requests_to_slow_http2_server_with_low_max_concurrent
574574
}
575575

576576
#[test]
577-
fn client_cannot_be_built_with_non_absolute_url() {
577+
fn client_cannot_be_built_with_relative_base_url() {
578578
let result = reqwest::Client::builder().base_url("/users/123").build();
579579

580580
assert!(result.is_err());
581581
}
582582

583-
/*
583+
#[test]
584+
fn client_can_be_built_with_absolute_base_url() {
585+
let result = reqwest::Client::builder()
586+
.base_url("http://example.com/users/123")
587+
.build();
588+
589+
assert!(result.is_ok());
590+
}
591+
584592
#[tokio::test]
585-
async fn todo_() {
593+
async fn client_with_base_url_accepts_relative_urls() {
586594
let _ = env_logger::builder().is_test(true).try_init();
587595
let server = server::http(move |_req| async { http::Response::new("Hello".into()) });
588596

589-
let url = format!(
590-
"http://{overridden_domain}:{}/domain_override",
591-
server.addr().port()
592-
);
597+
let server_base_url = format!("http://{}", server.addr());
593598
let client = reqwest::Client::builder()
599+
.base_url(server_base_url)
594600
.no_proxy()
595-
.resolve(overridden_domain, server.addr())
596601
.build()
597602
.expect("client builder");
598-
let req = client.get(&url);
603+
604+
// use a relative url on request
605+
let req = client.get("/hello");
606+
let res = req.send().await.expect("request");
607+
608+
assert_eq!(res.status(), reqwest::StatusCode::OK);
609+
let text = res.text().await.expect("Failed to get text");
610+
assert_eq!("Hello", text);
611+
}
612+
613+
#[tokio::test]
614+
async fn client_with_base_url_accepts_absolute_urls() {
615+
let _ = env_logger::builder().is_test(true).try_init();
616+
let server = server::http(move |_req| async { http::Response::new("Hello".into()) });
617+
618+
let client = reqwest::Client::builder()
619+
.base_url("http://example.com")
620+
.no_proxy()
621+
.build()
622+
.expect("client builder");
623+
624+
// use an absolute url on request
625+
let request_absolute_url = format!("http://{}/hello", server.addr());
626+
let req = client.get(request_absolute_url);
599627
let res = req.send().await.expect("request");
600628

601629
assert_eq!(res.status(), reqwest::StatusCode::OK);
602630
let text = res.text().await.expect("Failed to get text");
603631
assert_eq!("Hello", text);
604632
}
605-
*/

0 commit comments

Comments
 (0)