1#![doc = include_str!("../README.md")]
2
3#[cfg(doctest)]
4#[doc = include_str!("../../../docs/api.md")]
5pub struct ApiMap;
6
7#[cfg(doctest)]
8pub mod guide {
9 #[doc = include_str!("../../../docs/README.md")]
10 pub struct Index;
11 #[doc = include_str!("../../../docs/guide/quick-start.md")]
12 pub struct QuickStart;
13 #[doc = include_str!("../../../docs/guide/sessions.md")]
14 pub struct Sessions;
15 #[doc = include_str!("../../../docs/guide/requests.md")]
16 pub struct Requests;
17 #[doc = include_str!("../../../docs/guide/responses.md")]
18 pub struct Responses;
19 #[doc = include_str!("../../../docs/guide/streaming.md")]
20 pub struct Streaming;
21 #[doc = include_str!("../../../docs/guide/retries-and-timeouts.md")]
22 pub struct Retries;
23 #[doc = include_str!("../../../docs/guide/proxies.md")]
24 pub struct Proxies;
25 #[doc = include_str!("../../../docs/guide/cookies.md")]
26 pub struct Cookies;
27 #[doc = include_str!("../../../docs/guide/websocket.md")]
28 pub struct WebSocket;
29 #[doc = include_str!("../../../docs/guide/http3.md")]
30 pub struct Http3;
31 #[doc = include_str!("../../../docs/guide/tls-trust.md")]
32 pub struct TlsTrust;
33 #[doc = include_str!("../../../docs/guide/network.md")]
34 pub struct Network;
35 #[doc = include_str!("../../../docs/guide/fingerprints.md")]
36 pub struct Fingerprints;
37 #[doc = include_str!("../../../docs/guide/features-and-targets.md")]
38 pub struct Features;
39 #[doc = include_str!("../../../docs/guide/profiles.md")]
40 pub struct Profiles;
41 #[doc = include_str!("../../../docs/guide/choosing-a-profile.md")]
42 pub struct ChoosingAProfile;
43 #[doc = include_str!("../../../docs/guide/redirects.md")]
44 pub struct Redirects;
45 #[doc = include_str!("../../../docs/guide/errors.md")]
46 pub struct Errors;
47 #[doc = include_str!("../../../docs/guide/logging.md")]
48 pub struct Logging;
49 #[doc = include_str!("../../../docs/guide/platforms.md")]
50 pub struct Platforms;
51 #[doc = include_str!("../../../docs/guide/cancellation.md")]
52 pub struct Cancellation;
53 #[doc = include_str!("../../../docs/guide/testing.md")]
54 pub struct Testing;
55 #[doc = include_str!("../../../docs/guide/service-integration.md")]
56 pub struct ServiceIntegration;
57 #[doc = include_str!("../../../docs/guide/crawling.md")]
58 pub struct Crawling;
59 #[doc = include_str!("../../../docs/guide/accounts.md")]
60 pub struct Accounts;
61 #[doc = include_str!("../../../docs/guide/api-clients.md")]
62 pub struct ApiClients;
63}
64
65macro_rules! bench_pub {
66 ($(#[$meta:meta])* fn $($rest:tt)*) => {
67 #[cfg(feature = "bench-internals")]
68 $(#[$meta])*
69 pub fn $($rest)*
70
71 #[cfg(not(feature = "bench-internals"))]
72 $(#[$meta])*
73 pub(crate) fn $($rest)*
74 };
75}
76
77pub mod audit;
78pub mod cookie;
79pub mod profile;
80pub mod tls;
81pub mod trace;
82
83pub(crate) mod core;
84#[cfg(feature = "bench-internals")]
85#[doc(hidden)]
86pub mod h2;
87#[cfg(not(feature = "bench-internals"))]
88pub(crate) mod h2;
89pub(crate) mod header_str;
90pub(crate) mod iana;
91#[cfg(feature = "bench-internals")]
92#[doc(hidden)]
93pub mod pool;
94#[cfg(not(feature = "bench-internals"))]
95pub(crate) mod pool;
96#[cfg(feature = "bench-internals")]
97#[doc(hidden)]
98pub mod fuzz {
99 pub use crate::cookie::parse::parse_cookie_date;
100 pub use crate::pool::h1::parse::{parse_h1_head, read_chunked_body};
101 pub use crate::tls::proxy::http::validate_connect_response;
102
103 pub fn parse_set_cookie(header: &str, request_url: &str) -> Option<crate::cookie::Cookie> {
104 let parsed = url::Url::parse(request_url).ok()?;
105 crate::cookie::parse::parse_set_cookie(header, &parsed)
106 }
107
108 pub fn extension_ids(tls: &crate::profile::TlsProfile) -> Vec<u16> {
109 crate::profile::permutation::extension_ids(tls)
110 }
111
112 pub fn parse_links(header: &str, base: &str) -> Vec<crate::Link> {
113 url::Url::parse(base)
114 .map(|base| crate::core::parse_links(header, &base))
115 .unwrap_or_default()
116 }
117}
118#[cfg(feature = "html")]
119pub mod html;
120#[cfg(feature = "http3")]
121pub(crate) mod quic;
122pub(crate) mod tcp;
123#[cfg(feature = "test-util")]
124pub mod testing;
125mod util;
126
127pub use http;
128pub use url::Url;
129
130#[cfg(feature = "tower")]
131pub use crate::core::LeylineService;
132#[cfg(feature = "websocket")]
133pub use crate::core::WebSocketBuilder;
134pub use crate::core::{
135 BlockKind, BlockRules, BlockSignal, Body, BodyStream, CompressionConfig, ContentEncoding,
136 Device, DeviceAutosave, DeviceAutosaveOptions, DigestAuth, DnsConfig, Error, ErrorCategory,
137 FetchSite, HostLimits, HostStats, HttpVersion, Identity, IntoParamPair, IntoUrl, Kind, Link,
138 NoProxy, Pages, PoolConfig, ProtocolPolicy, ProxyConfig, ProxyHealth, ProxyPool, ProxyRule,
139 ProxyUrl, RedirectAction, RedirectAttempt, RedirectPolicy, RelayBody, RequestBuilder, Response,
140 ResponseTiming, Result, RetryPolicy, RetryTrigger, Session, SessionBuilder, SessionIdentity,
141 SessionState, SocketConfig, Tab, TimeoutConfig, WaitFormat, WebSocketConfig, relay_headers,
142};
143pub use crate::pool::{PoolStats, TlsInfo};
144pub use crate::util::redact as redact_url;
145
146pub async fn get(url: impl IntoUrl) -> Result<Response> {
147 Session::builder().build()?.get(url).send().await
148}
149
150#[cfg(feature = "multipart")]
151pub mod multipart {
152 pub use crate::core::multipart::{Form, Part};
153}
154
155use crate::profile::ProfileRegistry;
156pub use crate::profile::anchor::HeaderAnchor;
157pub use crate::profile::brand::ChromiumBrand;
158pub use crate::profile::browser::{Browser, Family};
159pub use crate::profile::platform::Platform;
160pub use crate::profile::preset::Preset;
161pub use crate::profile::types::BrowserProfile;
162
163pub use crate::tcp::TcpProfile;
164
165pub use crate::h2::{ErrorCode, H2Error};
166
167#[cfg(all(feature = "http3", feature = "bench-internals"))]
168#[doc(hidden)]
169pub use crate::quic::H3Config;
170
171#[cfg(feature = "websocket")]
172pub use crate::core::{CloseFrame, WsConnection, WsMessage, WsSink, WsStream};
173
174#[cfg(any(leyline_unstable_bssl, feature = "bench-internals"))]
175pub use crate::tls::TlsContext;
176pub use crate::tls::builder::TlsMinVersion;
177pub use crate::tls::error::{ProxyReply, TlsError};
178pub use crate::tls::trust::TlsTrustConfig;
179
180impl Browser {
181 pub fn profile(self) -> &'static BrowserProfile {
182 ProfileRegistry::global().get_browser(self).expect(
183 "built-in profile missing - registry integrity check in tests would have caught this",
184 )
185 }
186
187 pub(crate) fn shared_profile(self) -> std::sync::Arc<BrowserProfile> {
188 ProfileRegistry::global().shared(self).expect(
189 "built-in profile missing - registry integrity check in tests would have caught this",
190 )
191 }
192}