better_fetch/backend/
mod.rs1pub(crate) mod exec;
2mod reqwest;
3
4pub use reqwest::ReqwestBackend;
5
6use async_trait::async_trait;
7use bytes::Bytes;
8use http::{HeaderMap, Method, StatusCode};
9use std::time::Duration;
10
11use crate::cancel::CancellationToken;
12use crate::Result;
13
14#[cfg(feature = "multipart")]
15use crate::multipart::Form as MultipartForm;
16
17#[derive(Debug, Clone, Default)]
19pub enum HttpBody {
20 #[default]
21 Empty,
22 Bytes(Bytes),
23}
24
25#[derive(Debug)]
27pub struct HttpRequest {
28 pub method: Method,
29 pub url: url::Url,
30 pub headers: HeaderMap,
31 pub body: HttpBody,
32 pub timeout: Option<Duration>,
33 pub cancellation: Option<CancellationToken>,
34 #[cfg(feature = "multipart")]
35 pub multipart: Option<MultipartForm>,
36}
37
38impl Clone for HttpRequest {
39 fn clone(&self) -> Self {
40 Self {
41 method: self.method.clone(),
42 url: self.url.clone(),
43 headers: self.headers.clone(),
44 body: self.body.clone(),
45 timeout: self.timeout,
46 cancellation: self.cancellation.clone(),
47 #[cfg(feature = "multipart")]
48 multipart: None,
49 }
50 }
51}
52
53#[derive(Debug, Clone)]
55pub struct HttpResponse {
56 pub status: StatusCode,
57 pub headers: HeaderMap,
58 pub body: Bytes,
59}
60
61#[async_trait]
62pub trait HttpBackend: Send + Sync {
63 async fn execute(&self, request: HttpRequest) -> Result<HttpResponse>;
64}