rquest/client/emulation.rs
1use crate::{Http1Config, Http2Config, TlsConfig};
2use http::{HeaderMap, HeaderName};
3use std::borrow::Cow;
4use typed_builder::TypedBuilder;
5
6/// Trait defining the interface for providing an `EmulationProvider`.
7///
8/// The `EmulationProviderFactory` trait is designed to be implemented by types that can provide
9/// an `EmulationProvider` instance. This trait abstracts the creation and configuration of
10/// `EmulationProvider`, allowing different types to offer their own specific configurations.
11///
12/// # Example
13///
14/// ```rust
15/// use rquest::{EmulationProviderFactory, EmulationProvider};
16///
17/// struct MyEmulationProvider;
18///
19/// impl EmulationProviderFactory for MyEmulationProvider {
20/// fn emulation(self) -> EmulationProvider {
21/// EmulationProvider::default()
22/// }
23/// }
24///
25/// let provider = MyEmulationProvider.emulation();
26/// ```
27pub trait EmulationProviderFactory {
28 /// Provides an `EmulationProvider` instance.
29 fn emulation(self) -> EmulationProvider;
30}
31
32/// HTTP connection context that manages both HTTP and TLS configurations.
33///
34/// The `EmulationProvider` provides a complete environment for HTTP connections,
35/// including both HTTP-specific settings and the underlying TLS configuration.
36/// This unified context ensures consistent behavior across connections.
37///
38/// # Components
39///
40/// - **TLS Configuration**: Manages secure connection settings.
41/// - **HTTP Settings**: Controls HTTP/1 and HTTP/2 behaviors.
42/// - **Header Management**: Handles default headers and their ordering.
43///
44/// # Example
45///
46/// ```rust
47/// use rquest::EmulationProvider;
48/// use rquest::TlsConfig;
49///
50/// let provider = EmulationProvider::builder()
51/// .tls_config(TlsConfig::default())
52/// .build();
53/// ```
54#[derive(TypedBuilder, Default, Debug)]
55pub struct EmulationProvider {
56 /// TLS configuration for secure connections.
57 #[builder(default, setter(into))]
58 pub(crate) tls_config: Option<TlsConfig>,
59
60 /// HTTP/1 connection settings.
61 #[builder(default, setter(into))]
62 pub(crate) http1_config: Option<Http1Config>,
63
64 /// HTTP/2 connection settings.
65 #[builder(default, setter(into))]
66 pub(crate) http2_config: Option<Http2Config>,
67
68 /// Default headers for all requests.
69 #[builder(default, setter(into))]
70 pub(crate) default_headers: Option<HeaderMap>,
71
72 /// Header ordering for requests.
73 #[builder(default, setter(strip_option, into))]
74 pub(crate) headers_order: Option<Cow<'static, [HeaderName]>>,
75}
76
77/// Implement `EmulationProviderFactory` for `EmulationProvider`.
78///
79/// This implementation allows an `EmulationProvider` to be used wherever an
80/// `EmulationProviderFactory` is required, providing a default emulation configuration.
81impl EmulationProviderFactory for EmulationProvider {
82 fn emulation(self) -> EmulationProvider {
83 self
84 }
85}