Trait tower_http::follow_redirect::policy::Policy
source · pub trait Policy<B, E> {
fn redirect(&mut self, attempt: &Attempt<'_>) -> Result<Action, E>;
fn on_request(&mut self, _request: &mut Request<B>) { ... }
fn clone_body(&self, _body: &B) -> Option<B> { ... }
}
Available on crate feature
follow-redirect
only.Expand description
Trait for the policy on handling redirection responses.
Example
Detecting a cyclic redirection:
use http::{Request, Uri};
use std::collections::HashSet;
use tower_http::follow_redirect::policy::{Action, Attempt, Policy};
#[derive(Clone)]
pub struct DetectCycle {
uris: HashSet<Uri>,
}
impl<B, E> Policy<B, E> for DetectCycle {
fn redirect(&mut self, attempt: &Attempt<'_>) -> Result<Action, E> {
if self.uris.contains(attempt.location()) {
Ok(Action::Stop)
} else {
self.uris.insert(attempt.previous().clone());
Ok(Action::Follow)
}
}
}
Required Methods§
Provided Methods§
sourcefn on_request(&mut self, _request: &mut Request<B>)
fn on_request(&mut self, _request: &mut Request<B>)
Invoked right before the service makes a request, regardless of whether it is redirected or not.
This can for example be used to remove sensitive headers from the request or prepare the request in other ways.
The default implementation does nothing.
sourcefn clone_body(&self, _body: &B) -> Option<B>
fn clone_body(&self, _body: &B) -> Option<B>
Try to clone a request body before the service makes a redirected request.
If the request body cannot be cloned, return None
.
This is not invoked when B::size_hint
returns zero,
in which case B::default()
will be used to create a new request body.
The default implementation returns None
.