Skip to content

Commit dd596a8

Browse files
authored
Merge pull request #435 from jbr/add_response_redirect
Add Response::redirect
2 parents e74cb4c + bf7fbea commit dd596a8

File tree

2 files changed

+47
-4
lines changed

2 files changed

+47
-4
lines changed

src/redirect.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
use crate::utils::BoxFuture;
2-
use http_types::StatusCode;
3-
42
use crate::{Endpoint, Request, Response};
53

64
/// Redirect a route to another route.
@@ -32,8 +30,7 @@ pub struct Redirect {
3230

3331
impl<State> Endpoint<State> for Redirect {
3432
fn call<'a>(&'a self, _req: Request<State>) -> BoxFuture<'a, crate::Result<Response>> {
35-
let res = Response::new(StatusCode::TemporaryRedirect)
36-
.set_header("location".parse().unwrap(), self.location.clone());
33+
let res = Response::redirect_temp(&self.location);
3734
Box::pin(async move { Ok(res) })
3835
}
3936
}

src/response/mod.rs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,52 @@ impl Response {
5353
}
5454
}
5555

56+
/// Creates a response that represents a permanent redirect to `location`.
57+
///
58+
///
59+
/// # Example
60+
///
61+
/// ```
62+
/// # use tide::{Response, Request};
63+
/// # fn canonicalize(uri: &url::Url) -> Option<&url::Url> { None }
64+
/// # #[allow(dead_code)]
65+
/// async fn route_handler(request: Request<()>) -> tide::Result<Response> {
66+
/// if let Some(canonical_redirect) = canonicalize(request.uri()) {
67+
/// Ok(Response::redirect_perm(canonical_redirect))
68+
/// } else {
69+
/// //...
70+
/// # Ok(Response::new(http_types::StatusCode::Ok)) // ...
71+
/// }
72+
/// }
73+
/// ```
74+
pub fn redirect_perm(location: impl AsRef<str>) -> Self {
75+
Response::new(StatusCode::PermanentRedirect)
76+
.set_header("location".parse().unwrap(), location)
77+
}
78+
79+
/// Creates a response that represents a temporary redirect to `location`.
80+
///
81+
///
82+
/// # Example
83+
///
84+
/// ```
85+
/// # use tide::{Response, Request};
86+
/// # fn special_sale_today() -> Option<String> { None }
87+
/// # #[allow(dead_code)]
88+
/// async fn route_handler(request: Request<()>) -> tide::Result<Response> {
89+
/// if let Some(sale_url) = special_sale_today() {
90+
/// Ok(Response::redirect_temp(sale_url))
91+
/// } else {
92+
/// //...
93+
/// # Ok(Response::new(http_types::StatusCode::Ok)) //...
94+
/// }
95+
/// }
96+
/// ```
97+
pub fn redirect_temp(location: impl AsRef<str>) -> Self {
98+
Response::new(StatusCode::TemporaryRedirect)
99+
.set_header("location".parse().unwrap(), location)
100+
}
101+
56102
/// Returns the statuscode.
57103
pub fn status(&self) -> http_types::StatusCode {
58104
self.res.status()

0 commit comments

Comments
 (0)