use http::Extensions;
use reqwest::{Request, Response, header};
use reqwest_middleware::{Middleware, Next, Result};
use reqwest_retry::{RetryTransientMiddleware, policies::ExponentialBackoff};
pub(crate) struct RetryMiddleware {
inner: RetryTransientMiddleware<ExponentialBackoff>,
}
#[async_trait::async_trait]
impl Middleware for RetryMiddleware {
async fn handle(
&self,
req: Request,
extensions: &mut Extensions,
next: Next<'_>,
) -> Result<Response> {
match req.headers().get(header::CONTENT_TYPE).map(|v| v.to_str()) {
Some(Ok(content_type)) => {
if content_type.contains("multipart/form-data")
|| content_type == "application/octet-stream"
{
next.run(req, extensions).await
} else {
self.inner.handle(req, extensions, next).await
}
}
_ => {
self.inner.handle(req, extensions, next).await
}
}
}
}
impl From<RetryTransientMiddleware<ExponentialBackoff>> for RetryMiddleware {
fn from(inner: RetryTransientMiddleware<ExponentialBackoff>) -> Self {
Self { inner }
}
}