summaryrefslogtreecommitdiffstats
path: root/net/src/wkd.rs
diff options
context:
space:
mode:
Diffstat (limited to 'net/src/wkd.rs')
-rw-r--r--net/src/wkd.rs17
1 files changed, 12 insertions, 5 deletions
diff --git a/net/src/wkd.rs b/net/src/wkd.rs
index d061c7ef..cc14613c 100644
--- a/net/src/wkd.rs
+++ b/net/src/wkd.rs
@@ -237,13 +237,18 @@ fn parse_body<S: AsRef<str>>(body: &[u8], email_address: S)
fn get_following_redirects<'a, T>(
client: &'a hyper::client::Client<T>,
url: Uri,
-) -> BoxFuture<'a, hyper::Result<Response<Body>>>
+ depth: i32,
+) -> BoxFuture<'a, Result<Response<Body>>>
where
T: hyper::client::connect::Connect + Clone + Send + Sync + 'static,
{
async move {
let response = client.get(url).await;
+ if depth < 0 {
+ return Err(anyhow::anyhow!("Too many redirects"));
+ }
+
if let Ok(ref resp) = response {
if resp.status().is_redirection() {
let url = resp.headers().get("Location")
@@ -251,12 +256,12 @@ where
.flatten()
.map(|value| value.parse::<Uri>());
if let Some(Ok(url)) = url {
- return get_following_redirects(&client, url).await;
+ return get_following_redirects(&client, url, depth - 1).await;
}
}
}
- response
+ response.map_err(|err| anyhow::anyhow!(err))
}
.boxed()
}
@@ -312,10 +317,12 @@ pub async fn get<S: AsRef<str>>(email_address: S) -> Result<Vec<Cert>> {
let advanced_uri = wkd_url.to_uri(Variant::Advanced)?;
let direct_uri = wkd_url.to_uri(Variant::Direct)?;
+ const REDIRECT_LIMIT: i32 = 10;
+
// First, try the Advanced Method.
- let res = get_following_redirects(&client, advanced_uri)
+ let res = get_following_redirects(&client, advanced_uri, REDIRECT_LIMIT)
// Fall back to the Direct Method.
- .or_else(|_| get_following_redirects(&client, direct_uri))
+ .or_else(|_| get_following_redirects(&client, direct_uri, REDIRECT_LIMIT))
.await?;
let body = hyper::body::to_bytes(res.into_body()).await?;