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