Skip to main content

leyline/
lib.rs

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        tls.extension_ids()
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, PrefixRead, ProtocolPolicy, ProxyConfig, ProxyHealth, ProxyPool,
139    ProxyRule, ProxyUrl, Purpose, RedirectAction, RedirectAttempt, RedirectPolicy, RelayBody,
140    RequestBuilder, Response, ResponseTiming, Result, RetryPolicy, RetryTrigger, Robots,
141    RobotsSource, Session, SessionBuilder, SessionIdentity, SessionState, SocketConfig, StopReason,
142    Tab, TimeoutConfig, WaitFormat, WebSocketConfig, relay_headers,
143};
144#[cfg(feature = "html")]
145pub use crate::core::{Crawl, CrawlPage, CrawlStats, Respect, Scope, SkipReason};
146pub use crate::pool::{PoolStats, TlsInfo};
147pub use crate::util::redact as redact_url;
148
149pub async fn get(url: impl IntoUrl) -> Result<Response> {
150    Session::builder().build()?.get(url).send().await
151}
152
153#[cfg(feature = "multipart")]
154pub mod multipart {
155    pub use crate::core::multipart::{Form, Part};
156}
157
158use crate::profile::ProfileRegistry;
159pub use crate::profile::anchor::HeaderAnchor;
160pub use crate::profile::brand::ChromiumBrand;
161pub use crate::profile::browser::{Browser, Family};
162pub use crate::profile::platform::Platform;
163pub use crate::profile::preset::Preset;
164pub use crate::profile::types::BrowserProfile;
165
166pub use crate::tcp::TcpProfile;
167
168pub use crate::h2::{ErrorCode, H2Error};
169
170#[cfg(all(feature = "http3", feature = "bench-internals"))]
171#[doc(hidden)]
172pub use crate::quic::H3Config;
173
174#[cfg(feature = "websocket")]
175pub use crate::core::{CloseFrame, WsConnection, WsMessage, WsSink, WsStream};
176
177#[cfg(any(leyline_unstable_bssl, feature = "bench-internals"))]
178pub use crate::tls::TlsContext;
179pub use crate::tls::builder::TlsMinVersion;
180pub use crate::tls::error::{ProxyReply, TlsError};
181pub use crate::tls::trust::TlsTrustConfig;
182
183impl Browser {
184    pub fn profile(self) -> &'static BrowserProfile {
185        ProfileRegistry::global().get_browser(self).expect(
186            "built-in profile missing - registry integrity check in tests would have caught this",
187        )
188    }
189
190    pub(crate) fn shared_profile(self) -> std::sync::Arc<BrowserProfile> {
191        ProfileRegistry::global().shared(self).expect(
192            "built-in profile missing - registry integrity check in tests would have caught this",
193        )
194    }
195}