Skip to content

Commit d10f73a

Browse files
authored
Merge pull request #846 from http-rs/fix-redirect
fix infinite redirection recursion
2 parents 2556750 + 8d01758 commit d10f73a

File tree

2 files changed

+38
-9
lines changed

2 files changed

+38
-9
lines changed

src/redirect.rs

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -97,15 +97,42 @@ where
9797
}
9898

9999
impl<T: AsRef<str>> From<Redirect<T>> for Response {
100-
fn from(redirect: Redirect<T>) -> Response {
101-
redirect.into()
100+
fn from(redirect: Redirect<T>) -> Self {
101+
Response::builder(redirect.status)
102+
.header(LOCATION, redirect.location.as_ref())
103+
.build()
102104
}
103105
}
104106

105107
impl<T: AsRef<str>> From<&Redirect<T>> for Response {
106108
fn from(redirect: &Redirect<T>) -> Response {
107-
let mut res = Response::new(redirect.status);
108-
res.insert_header(LOCATION, redirect.location.as_ref());
109-
res
109+
Response::builder(redirect.status)
110+
.header(LOCATION, redirect.location.as_ref())
111+
.build()
112+
}
113+
}
114+
115+
#[cfg(test)]
116+
mod test {
117+
use super::*;
118+
use crate::*;
119+
120+
#[test]
121+
fn smoke() {
122+
let redirect = Redirect::new("https://example.com");
123+
let res: Response = redirect.clone().into();
124+
assert_eq!(res.status(), StatusCode::Found);
125+
126+
let redirect = Redirect::temporary("https://example.com");
127+
let res: Response = redirect.clone().into();
128+
assert_eq!(res.status(), StatusCode::TemporaryRedirect);
129+
130+
let redirect = Redirect::permanent("https://example.com");
131+
let res: Response = redirect.clone().into();
132+
assert_eq!(res.status(), StatusCode::PermanentRedirect);
133+
134+
let redirect = Redirect::see_other("https://example.com");
135+
let res: Response = redirect.clone().into();
136+
assert_eq!(res.status(), StatusCode::SeeOther);
110137
}
111138
}

tests/test_utils.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ pub async fn find_port() -> u16 {
66
pick_unused_port().expect("No ports free")
77
}
88

9-
use surf::{Client, RequestBuilder};
9+
use std::convert::TryInto;
10+
use surf::{Client, Config, RequestBuilder};
1011

1112
/// Trait that adds test request capabilities to tide [`Server`]s
1213
pub trait ServerTestingExt {
@@ -61,8 +62,9 @@ pub trait ServerTestingExt {
6162

6263
impl<State: Clone + Send + Sync + Unpin + 'static> ServerTestingExt for tide::Server<State> {
6364
fn client(&self) -> Client {
64-
let mut client = Client::with_http_client(self.clone());
65-
client.set_base_url(tide::http::Url::parse("http://example.com").unwrap());
66-
client
65+
let config = Config::new()
66+
.set_http_client(self.clone())
67+
.set_base_url(tide::http::Url::parse("http://example.com").unwrap());
68+
config.try_into().unwrap()
6769
}
6870
}

0 commit comments

Comments
 (0)