From 1df1812249807868dae86d914032d611313586cb Mon Sep 17 00:00:00 2001 From: 0x676e67 Date: Tue, 13 Aug 2024 23:57:40 +0800 Subject: [PATCH] feat(tls): Add preconfigured TLS settings --- README.md | 3 ++- examples/pre_configured_tls.rs | 10 ++++++++-- src/async_impl/client.rs | 10 ++++------ src/blocking/client.rs | 20 +++++++++++++++----- 4 files changed, 29 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 1605c01..a776712 100644 --- a/README.md +++ b/README.md @@ -10,12 +10,13 @@ An fast asynchronous Rust `Http`/`WebSocket` Client with `TLS`/`JA3`/`JA4`/`HTTP - `Async` or `blocking` Clients - `Plain`, `JSON`, `urlencoded`, `multipart` bodies -- Customizable `headers` order +- `Headers` order - Customizable `redirect` policy - Cookie Store - `HTTP`/`HTTPS`/`SOCKS5` Proxies - `HTTPS`/`WebSocket` via [BoringSSL](https://github.com/cloudflare/boring) - `JA3`/`JA4`/`HTTP2` fingerprint +- Preconfigured `TLS`/`HTTP2` settings - Impersonate `Chrome`/`Safari`/`Edge`/`OkHttp` Additional learning resources include: diff --git a/examples/pre_configured_tls.rs b/examples/pre_configured_tls.rs index d945332..0896f22 100644 --- a/examples/pre_configured_tls.rs +++ b/examples/pre_configured_tls.rs @@ -1,6 +1,7 @@ use std::error::Error; use boring::ssl::{SslConnector, SslMethod}; +use http::HeaderValue; use hyper::{PseudoOrder, SettingsOrder, StreamDependency, StreamId}; use rquest::{ tls::{Http2FrameSettings, TlsExtensionSettings, TlsSettings, Version}, @@ -42,9 +43,14 @@ async fn main() -> Result<(), Box> { }, }; - // Build a client to mimic Edge127 + // Build a client with pre-configured TLS settings let client = rquest::Client::builder() - .use_preconfigured_tls(|_headers| settings) + .use_preconfigured_tls( + || settings, + |headers| { + headers.insert("user-agent", HeaderValue::from_static("rquest")); + }, + ) .enable_ech_grease() .permute_extensions() .build()?; diff --git a/src/async_impl/client.rs b/src/async_impl/client.rs index ee1a322..22832a6 100644 --- a/src/async_impl/client.rs +++ b/src/async_impl/client.rs @@ -280,14 +280,12 @@ impl ClientBuilder { /// Use the preconfigured TLS settings. #[cfg(feature = "boring-tls")] - #[cfg(feature = "boring-tls")] - pub fn use_preconfigured_tls(self, f: F) -> ClientBuilder + pub fn use_preconfigured_tls(self, f1: F1, f2: F2) -> ClientBuilder where - F: FnOnce(&mut HeaderMap) -> TlsSettings, + F1: FnOnce() -> TlsSettings, + F2: FnOnce(&mut HeaderMap), { - let mut headers = self.config.headers.clone(); - let settings = f(&mut headers); - self.apply_tls_settings(settings, |_| {}) + self.apply_tls_settings(f1(), f2) } /// Apply the given TLS settings and header function. diff --git a/src/blocking/client.rs b/src/blocking/client.rs index 93b8b5f..4e2e0bc 100644 --- a/src/blocking/client.rs +++ b/src/blocking/client.rs @@ -15,10 +15,10 @@ use super::request::{Request, RequestBuilder}; use super::response::Response; use super::wait; #[cfg(feature = "boring-tls")] -use crate::tls; -#[cfg(feature = "boring-tls")] -use crate::tls::Impersonate; +use crate::tls::{Impersonate, TlsSettings, Version}; use crate::{async_impl, header, redirect, IntoUrl, Method, Proxy}; +#[cfg(feature = "boring-tls")] +use header::HeaderMap; #[cfg(feature = "http2")] use hyper::{PseudoOrder, SettingsOrder, StreamDependency}; @@ -107,6 +107,16 @@ impl ClientBuilder { self.with_inner(move |inner| inner.impersonate(ver)) } + /// Use the preconfigured TLS settings. + #[cfg(feature = "boring-tls")] + pub fn use_preconfigured_tls(self, f1: F1, f2: F2) -> ClientBuilder + where + F1: FnOnce() -> TlsSettings, + F2: FnOnce(&mut HeaderMap), + { + self.with_inner(move |inner| inner.use_preconfigured_tls(f)) + } + /// Enable Encrypted Client Hello (Secure SNI) #[cfg_attr(docsrs, doc(cfg(feature = "boring-tls")))] pub fn enable_ech_grease(self) -> ClientBuilder { @@ -699,7 +709,7 @@ impl ClientBuilder { /// /// feature to be enabled. #[cfg(feature = "boring-tls")] - pub fn min_tls_version(self, version: tls::Version) -> ClientBuilder { + pub fn min_tls_version(self, version: Version) -> ClientBuilder { self.with_inner(|inner| inner.min_tls_version(version)) } @@ -718,7 +728,7 @@ impl ClientBuilder { /// /// feature to be enabled. #[cfg(feature = "boring-tls")] - pub fn max_tls_version(self, version: tls::Version) -> ClientBuilder { + pub fn max_tls_version(self, version: Version) -> ClientBuilder { self.with_inner(|inner| inner.max_tls_version(version)) }