When using Reqwest, a popular HTTP client library in Rust, handling redirects is quite straightforward, as the library handles them automatically by default. However, if you need to customize the behavior, such as limiting the number of redirects or handling them manually, you can configure the redirect policy when building the client.
Here's how you can customize the redirect behavior using Reqwest:
Default Behavior
By default, Reqwest will follow up to a limit of 10 redirects. You don't need to do anything special for this default behavior. Here's a simple GET request example:
use reqwest::Error;
#[tokio::main]
async fn main() -> Result<(), Error> {
let response = reqwest::get("http://example.com")
.await?
.text()
.await?;
println!("Response text: {}", response);
Ok(())
}
Custom Redirect Policy
If you want to change the maximum number of redirects or handle them manually, you can configure the client like this:
use reqwest::{Client, Error, redirect::Policy};
#[tokio::main]
async fn main() -> Result<(), Error> {
let client = Client::builder()
// Set the maximum number of redirects to follow
.redirect(Policy::limited(5))
.build()?;
let response = client.get("http://example.com")
.send()
.await?
.text()
.await?;
println!("Response text: {}", response);
Ok(())
}
Handling Redirects Manually
If you want to handle redirects manually, you can use Policy::none()
to tell Reqwest not to follow redirects. Then you can inspect the response and follow the Location
header manually if needed.
use reqwest::{Client, Error, StatusCode, redirect::Policy};
#[tokio::main]
async fn main() -> Result<(), Error> {
let client = Client::builder()
.redirect(Policy::none())
.build()?;
let mut response = client.get("http://example.com")
.send()
.await?;
// Check if the response status is a redirect
if response.status().is_redirection() {
if let Some(location) = response.headers().get("Location") {
let location_str = location.to_str().unwrap_or_default();
println!("Redirected to: {}", location_str);
// Perform a new GET request to the redirect location if desired
// response = client.get(location_str).send().await?;
}
}
// Process the response as needed
Ok(())
}
When handling redirects manually, you should be cautious about the potential for infinite redirect loops or other issues such as redirect chains that may lead to unexpected behavior. Always validate the Location
header and consider setting a maximum number of allowed redirects in your logic to prevent infinite loops.