1use async_trait::async_trait;
2use std::any::Any;
3use std::time::Duration;
4
5use crate::error::SpiderError;
6use crate::request::Request;
7use crate::response::Response;
8
9#[allow(clippy::large_enum_variant)]
10pub enum MiddlewareAction<T> {
12 Continue(T),
14 Retry(Box<Request>, Duration),
16 Drop,
18 ReturnResponse(Response),
20}
21
22#[async_trait]
24pub trait Middleware<C: Send + Sync>: Any + Send + Sync + 'static {
25 fn name(&self) -> &str;
26
27 async fn process_request(
28 &mut self,
29 _client: &C,
30 request: Request,
31 ) -> Result<MiddlewareAction<Request>, SpiderError> {
32 Ok(MiddlewareAction::Continue(request))
33 }
34 async fn process_response(
35 &mut self,
36 response: Response,
37 ) -> Result<MiddlewareAction<Response>, SpiderError> {
38 Ok(MiddlewareAction::Continue(response))
39 }
40}