rquest
🚀 Help me work seamlessly with open source sharing by sponsoring me on GitHub
An ergonomic, all-in-one JA3/JA4/HTTP2 fingerprint HTTP/WebSocket client.
- Plain, JSON, urlencoded, multipart bodies
- Header Order
- Redirect Policy
- Cookie Store
- HTTP Proxies
- Restrict pool connections
HTTPS/WebSocketvia BoringSSL- Preconfigured
TLS/HTTP2settings - Changelog
Additional learning resources include:
âš This crate is under active development and the API is not yet stable.
Usage
This asynchronous example uses Tokio and enables some
optional features, so your Cargo.toml could look like this:
HTTP
[]
= { = "1", = ["full"] }
= "1.0.0-rc.2"
use Impersonate;
async
WebSocket
[]
= { = "1", = ["full"] }
= { = "1.0.0-rc.2", = ["websocket"] }
= { = "0.3.0", = false, = ["std"] }
use ;
use ;
async
More examples can be found in the examples directory.
Connection Pool
Regarding the design strategy of the connection pool, rquest and reqwest are implemented differently. rquest reconstructs the entire connection layer, treating each host with the same proxy or bound IP/Interface as the same connection, while reqwest treats each host as an independent connection. Specifically, the connection pool of rquest is managed based on the host and proxy/IP/Interface, while the connection pool of reqwest is managed only by the host. In other words, when using rquest, you can flexibly switch between proxies, IP or Interface without affecting the management of the connection pool.
Interfacerefers to the network interface of the device, such aswlan0oreth0.
Root Certificate
By default, rquest uses Mozilla's root certificates through the webpki-roots crate. This is a static root certificate bundle that is not automatically updated. It also ignores any root certificates installed on the host running rquest, which may be a good thing or a bad thing, depending on your point of view. But you can turn off default-features to cancel the default certificate bundle, and the system default certificate path will be used to load the certificate. In addition, rquest also provides a certificate store for users to customize the update certificate.
Device
You can customize the TLS/HTTP2 fingerprint parameters of the device. In addition, the basic device impersonation types are provided as follows:
- Chrome
Chrome100,Chrome101,Chrome104,Chrome105,Chrome106,Chrome107,Chrome108,Chrome109,Chrome114,Chrome116,Chrome117,Chrome118,Chrome119,Chrome120,Chrome123,Chrome124,Chrome126,Chrome127,Chrome128,Chrome129,Chrome130,Chrome131
- Edge
Edge101,Edge122,Edge127,Edge131
- Safari
SafariIos17_2,SafariIos17_4_1,SafariIos16_5,Safari15_3,Safari15_5,Safari15_6_1,Safari16,Safari16_5,Safari17_0,Safari17_2_1,Safari17_4_1,Safari17_5,Safari18,SafariIPad18, Safari18_2, Safari18_1_1
- OkHttp
OkHttp3_9,OkHttp3_11,OkHttp3_13,OkHttp3_14,OkHttp4_9,OkHttp4_10,OkHttp5
- Firefox
Firefox109, Firefox133
It is not supported for Firefox device that use http2 priority frames. If anyone is willing to help implement it, please submit a patch to the h2 repository.
Requirement
Install the environment required to build BoringSSL
Do not compile with crates that depend on OpenSSL; their prefixing symbols are the same and may cause linking failures.
If both OpenSSL and BoringSSL are used as dependencies simultaneously, even if the compilation succeeds, strange issues may still arise.
If you prefer compiling for the musl target, it is recommended to use the tikv-jemallocator memory allocator; otherwise, multithreaded performance may be suboptimal. Only available in version 0.6.0, details: https://github.com/tikv/jemallocator/pull/70
Building
sudo apt-get install build-essential cmake perl pkg-config libclang-dev musl-tools -y
cargo build --release
You can also use this GitHub Actions workflow to compile your project on Linux, Windows, and macOS.
About
The predecessor of rquest is reqwest. rquest is a specialized adaptation based on the reqwest project, supporting BoringSSL and related HTTP/2 fingerprints in requests.
It also optimizes commonly used APIs and enhances compatibility with connection pools, making it easier to switch proxies, IP addresses, and interfaces. You can directly migrate from a project using reqwest to rquest.
Due to limited time for maintaining the synchronous APIs, only asynchronous APIs are supported. I may have to give up maintenance; if possible, please consider sponsoring me.
Contributing
If you would like to submit your contribution, please open a Pull Request.
Getting help
Your question might already be answered on the issues
License
Apache-2.0 LICENSE
Accolades
The project is based on a fork of reqwest.