Skip to main content

better_fetch/backend/
mod.rs

1pub(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/// Request body encoding for the transport layer.
18#[derive(Debug, Clone, Default)]
19pub enum HttpBody {
20    #[default]
21    Empty,
22    Bytes(Bytes),
23}
24
25/// Prepared HTTP request passed to a backend.
26#[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/// Raw HTTP response from a backend.
54#[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}