Skip to content

Rust HTTP Client with TLS, JA3/JA4, and HTTP2 fingerprint

License

Notifications You must be signed in to change notification settings

0x676e67/rquest

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

rquest - rust & quest

CI Crates.io License crates.io Crates.io Total Downloads

🚀 Help me work seamlessly with open source sharing by sponsoring me on GitHub

An ergonomic, all-in-one HTTP client for spoofing any browser with TLS, JA3/JA4, and HTTP2 fingerprints.

Features

  • Plain, JSON, urlencoded, multipart bodies
  • Header Order
  • Redirect Policy
  • Cookie Store
  • HTTP Proxies
  • WebSocket Upgrade
  • HTTPS via BoringSSL
  • Perfectly impersonate Chrome, Safari, and Firefox

Additional learning resources include:

Example

This asynchronous example uses Tokio and enables some optional features. Your Cargo.toml could look like this:

[dependencies]
tokio = { version = "1", features = ["full"] }
rquest = "2.0.0"

And then the code:

use rquest::{Client, Impersonate};

#[tokio::main]
async fn main() -> Result<(), rquest::Error> {
    // Build a client to impersonate Firefox133
    let client = Client::builder()
        .impersonate(Impersonate::Firefox133)
        .build()?;

    // Use the API you're already familiar with
    let resp = client.get("https://tls.peet.ws/api/all").send().await?;
    println!("{}", resp.text().await?);

    Ok(())
}

Overview

This project is a fork of reqwest, similar to how BoringSSL is a fork of OpenSSL. It optimizes commonly used APIs and enhances compatibility with connection pools, making it easier to switch proxies, IP addresses, and interfaces. Projects using reqwest can be migrated to rquest with minimal changes.

Overall, rquest is a superset of reqwest, offering simpler and more practical APIs while also fixing HTTP version negotiation issues.

Performance

BoringSSL is a fork of OpenSSL designed for security and efficiency, used by Google Chrome, Android, and Cloudflare. We haven't encountered serious issues with BoringSSL related to the Golang utls issue.

By default, HTTP2 tracing is turned off, reducing performance overhead by 15%. For more information, see issue: hyperium/h2#713

Connection Pool

The client can configure the maximum number of connection pools. Request manages connections based on Host and Proxy/IP/Interface, and can flexibly switch between them.

  • Interface refers to the network interface of the device, such as wlan0 or eth0.

Root Certificate

By default, rquest uses Mozilla's root certificates through the webpki-roots crate. This static root certificate bundle is not automatically updated and ignores any root certificates installed on the host. You can disable default-features to use the system's default certificate path. Additionally, rquest provides a certificate store for users to customize and update certificates.

Fingerprint

  • TLS/HTTP2 Fingerprint

    Supports custom TLS/HTTP2 fingerprint parameters. Customization is not recommended unless you are highly familiar with TLS and HTTP2, as it may cause unexpected issues.

  • JA3/JA4/Akamai Fingerprint

    JA3/JA4/Akamai fingerprints cannot accurately simulate browser fingerprints due to the sophistication of TLS encryption and the popularity of HTTP2. rquest does not plan to support parsing these fingerprint strings for simulation. Users are encouraged to customize the configuration according to their own needs.

    Note: Many Akamai fingerprint strings are incomplete. For example, the website lacks Priority and Stream ID in the Headers Frame, making it easy to detect. For details, refer to the HTTP2 frame parser.

  • Default Fingerprint

    In fact, most device models have the same TLS/HTTP2 configuration, except that the User-Agent is changed.

    Default device emulation types
    • Chrome

      Chrome100Chrome101Chrome104Chrome105Chrome106Chrome107Chrome108Chrome109Chrome114Chrome116Chrome117Chrome118Chrome119Chrome120Chrome123Chrome124Chrome126Chrome127Chrome128Chrome129Chrome130Chrome131

    • Edge

      Edge101Edge122Edge127Edge131

    • Safari

      SafariIos17_2SafariIos17_4_1SafariIos16_5Safari15_3Safari15_5Safari15_6_1Safari16Safari16_5Safari17_0Safari17_2_1Safari17_4_1Safari17_5Safari18SafariIPad18, Safari18_2, Safari18_1_1

    • OkHttp

      OkHttp3_9OkHttp3_11OkHttp3_13OkHttp3_14OkHttp4_9OkHttp4_10OkHttp5

    • Firefox

      Firefox109, Firefox117, Firefox128, Firefox133

Requirements

Do not compile with packages that depend on openssl-sys; it links with the same prefix symbol as boring-sys, which can cause link failures and other problems. Even if compilation succeeds, using both openssl-sys and boring-sys as dependencies can cause memory segmentation faults.

Building

Install the dependencies required to build BoringSSL

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.

Contribution

If you would like to submit your contribution, please open a Pull Request.

License

Apache-2.0 LICENSE

Accolades

The project is based on a fork of reqwest.