Skip to main content

Crate reqrio

Crate reqrio 

Source
Expand description

§reqrio is an HTTP request library designed for fast, simple, and convenient HTTP request usage.

  • Features: Low copy, high concurrency, low overhead

  • Supports TLS fingerprinting, which can be configured via hexadecimal, Ja3, or Ja4 TLS handshake settings (subscription only).

  • Ensures request header order (see Request Header Order Table), consistent with browsers.

  • Uses BoringSSL to implement TLS, consistent with browsers like Chrome and Edge.

§Request Header Order Table

No.HTTP/2.0HTTP/1.1
1cache-controlHost
2sec-ch-uaConnection
3sec-ch-ua-mobileContent-Length
4sec-ch-ua-full-versionAuthorization
5sec-ch-ua-archContent-Type
6sec-ch-ua-platformCache-Control
7sec-ch-ua-platform-versionsec-ch-ua
8sec-ch-ua-modelsec-ch-ua-mobile
9sec-ch-ua-bitnesssec-ch-ua-platform
10sec-ch-ua-full-version-listUpgrade-Insecure-Requests
11upgrade-insecure-requestsUser-Agent
12user-agentAccept
13acceptSec-Fetch-Site
14originSec-Fetch-Mode
15sec-fetch-siteSec-Fetch-User
16sec-fetch-modeSec-Fetch-Dest
17sec-fetch-userSec-Fetch-Storage-Access
18sec-fetch-destReferer
19sec-fetch-storage-accessAccept-Encoding
20refererAccept-Language
21accept-encodingCookie
22accept-languageOrigin
23cookie
24priority
//unknown
25content-encoding
26content-type
27authorization
28content-type
  • Rust HTTP Example
use reqrio::{Fingerprint, ScReq, ALPN};

fn ff() {
    let req = ScReq::new()
        //The default is to use http/1.1
        .with_alpn(ALPN::Http20)
        .with_url("https://www.baidu.com").unwrap();
    let headers = json::object! {
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
        "Accept-Encoding": "gzip, deflate, br, zstd",
        "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
        "Cache-Control": "no-cache",
        "Connection": "keep-alive",
        "Cookie": "__guid=15015764.1071255116101212729.1764940193317.2156; env_webp=1; _S=pvc5q7leemba50e4kn4qis4b95; QiHooGUID=4C8051464B2D97668E3B21198B9CA207.1766289287750; count=1; so-like-red=2; webp=1; so_huid=114r0SZFiQcJKtA38GZgwZg%2Fdit1cjUGuRcsIL2jTn4%2FE%3D; __huid=114r0SZFiQcJKtA38GZgwZg%2Fdit1cjUGuRcsIL2jTn4%2FE%3D; gtHuid=1",
        "Host": "m.so.com",
        "Pragma": "no-cache",
        "Sec-Fetch-Dest": "document",
        "Sec-Fetch-Mode": "navigate",
        "Sec-Fetch-Site": "none",
        "Sec-Fetch-User": "?1",
        "Upgrade-Insecure-Requests": 1,
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0",
        "sec-ch-ua": r#""Microsoft Edge";v="143", "Chromium";v="143", "Not A(Brand";v="24""#,
        "sec-ch-ua-mobile": "?0",
        "sec-ch-ua-platform": r#""Windows""#
    };
    //By default, there are no request headers; you need to configure them yourself.
    req.set_headers_json(header);
    let res = req.get().unwrap();
    //Get response headers
    let header = res.header();
    //Get the response body; the body here has already been decoded.
    let body = res.decode_body().unwrap();
    //Try decoding to JSON
    let json = res.json().unwrap();
}
  • Rust WebSocket Example
use reqrio::*;

fn ff() {
    let mut ws = WebSocket::sync_build()
        .with_url("wss://poe.game.qq.com/").unwrap()
        .with_uri("wss://poe.game.qq.com/api/trade2/live/poe2/%E7%93%A6%E5%B0%94%E7%9A%84%E5%AE%BF%E5%91%BD/32Y6Wjkc5").unwrap()
        .with_origin("https://poe.game.qq.com").unwrap()
        .with_cookie("pac_uid=0_NattYaCs7NNmH; omgid=0_NattYaCs7NNmH; _qimei_uuid42=19c1f11150d1000f92fe16d850a9c40cf94ef1d39f; _qimei_fingerprint=f3dc39297e432b1f08da57e9904a8f52; _qimei_q36=; _qimei_h38=a549811f92fe16d850a9c40c02000006b19c1f; _qpsvr_localtk=0.2296543129537577; RK=WPZCq/wl3I; ptcz=c338dead622f05f0d8467ac10589e7e45326b81d67ff476b9643f933cfdc644a; eas_sid=M1b7q677w9D5R5P2L8x5g4p313; eas_entry=https%3A%2F%2Fgraph.qq.com%2F; POESESSID=939e23af876572a0b2852b2e183e20cc").unwrap()
        .with_user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0").unwrap()
        .build().unwrap();
    loop {
        let res = ws.read_frame().unwrap();
        match res.frame_type().op_code() {
            WsOpcode::CONTINUATION => {}
            WsOpcode::TEXT => println!("{}", res.payload().as_bytes().len()),
            WsOpcode::BINARY => {}
            WsOpcode::CLOSE => {}
            WsOpcode::PING => {
                println!("PING");
                let pong = WsFrame::new_pong(true, res.payload().as_bytes());
                ws.write_frame(pong).unwrap();
            }
            WsOpcode::PONG => {}
        }
    }
}

Re-exports§

pub use reqrio_json as json;

Modules§

base64
cipher
coder
hash
hex
Encoding and decoding hex strings.
hpack
rand

Structs§

Addr
Alert
AlgorithmSigner
Buffer
CertSigner
CertStore
CertType
Certificate
CertificateRequest
CertificateVerify
Certificates
Cipher
CipherSuite
ClientConfig
ClientHello
ClientKeyExchange
CompressionType
Connection
Cookie
EcPointFormat
Extension
ExtensionType
Fingerprint
FrameFlag
GroupType
H2Frame
Header
HeaderKey
HttpFile
HttpStatus
Param
ProxyStream
RecordDecodeBuffer
RecordLayer
Response
RsaCipher
RsaKey
ScReq
ServerConfig
ServerHello
ServerKeyExchange
SessionTicket
SignatureAlgorithm
SupportVersions
SyncStream
Timeout
TlsSessionTicket
Uri
Url
Version
WebSocket
WebSocketBuilder
WsFrame

Enums§

ALPN
Application
BasicConstraint
Body
BodyType
CertExtend
CipherType
ContentType
DnType
Font
FrameType
HeaderValue
HlsError
KeyIdentifier
KeyUsage
Message
Method
Padding
Proxy
RecordType
RlsError
RsaPadding
Scheme
SubjectAltName
Text
UrlError
WsOpcode

Constants§

CHUNK_END
HTTP_GAP

Traits§

ReqExt
ReqGenExt
WriteExt

Type Aliases§

ReqCallback