#libcurl #http-request #bindings #transfer #header #requests #web

ratcurl

Rust对libcurl的绑定,用于执行HTTP请求,支持curl-impersonate

1个不稳定版本

0.1.0 2023年1月20日

#254HTTP客户端

23每月下载量
3个crate中使用(通过ratmom

MIT许可证

435KB
6K SLoC

ratcurl

Rust的libcurl绑定,支持curl-impersonate

基于[curl-rust]的分支

Latest Version Documentation License Build

快速入门

use std::io::{stdout, Write};

use ratcurl::easy::Easy;

// Print a web page onto stdout
fn main() {
    let mut easy = Easy::new();
    easy.url("https://www.rust-lang.net.cn/").unwrap();
    easy.write_function(|data| {
        stdout().write_all(data).unwrap();
        Ok(data.len())
    }).unwrap();
    easy.perform().unwrap();

    println!("{}", easy.response_code().unwrap());
}
use ratcurl::easy::Easy;

// Capture output into a local `Vec`.
fn main() {
    let mut dst = Vec::new();
    let mut easy = Easy::new();
    easy.url("https://www.rust-lang.net.cn/").unwrap();

    let mut transfer = easy.transfer();
    transfer.write_function(|data| {
        dst.extend_from_slice(data);
        Ok(data.len())
    }).unwrap();
    transfer.perform().unwrap();
}

POST/PUT请求

Easy上的putpost方法可以配置HTTP请求的方法,然后可以使用read_function指定如何填充数据。此接口与实现Read的类型配合得很好。

use std::io::Read;
use ratcurl::easy::Easy;

fn main() {
    let mut data = "this is the body".as_bytes();

    let mut easy = Easy::new();
    easy.url("http://www.example.com/upload").unwrap();
    easy.post(true).unwrap();
    easy.post_field_size(data.len() as u64).unwrap();

    let mut transfer = easy.transfer();
    transfer.read_function(|buf| {
        Ok(data.read(buf).unwrap_or(0))
    }).unwrap();
    transfer.perform().unwrap();
}

自定义头部

自定义头部可以作为请求的一部分指定

use ratcurl::easy::{Easy, List};

fn main() {
    let mut easy = Easy::new();
    easy.url("http://www.example.com").unwrap();

    let mut list = List::new();
    list.append("Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==").unwrap();
    easy.http_headers(list).unwrap();
    easy.perform().unwrap();
}

长连接

句柄可以在多个请求之间重复使用。curl将尝试保持连接活跃。

use ratcurl::easy::Easy;

fn main() {
    let mut handle = Easy::new();

    handle.url("http://www.example.com/foo").unwrap();
    handle.perform().unwrap();

    handle.url("http://www.example.com/bar").unwrap();
    handle.perform().unwrap();
}

多个请求

libcurl库通过“multi”接口提供同时发送多个请求的支持。这目前绑定在此crate的multi模块中,并提供了同时执行多个传输的能力。有关更多信息,请参阅该模块。

构建

默认情况下,此crate将尝试动态链接到系统范围内的libcurl和系统范围内的SSL库。可以使用各种Cargo功能自定义一些此行为

  • ssl:启用使用平台默认TLS后端的SSL/TLS支持。在Windows上是Schannel,在macOS上是Secure Transport,在其他平台上是OpenSSL(或等效)。默认启用。

  • rustls:通过Rustls启用SSL/TLS支持,Rustls是一个受欢迎的替代TLS后端,用Rust编写。Rustls总是静态链接。默认禁用。

    请注意,Rustls在Curl内部的支持是实验性的,可能存在重大错误,所以我们不对此功能提供任何稳定性保证。

  • http2:通过libnghttp2启用HTTP/2支持。默认禁用。

  • static-curl:使用捆绑的libcurl版本并将其静态链接。默认禁用。

  • static-ssl:使用捆绑的OpenSSL版本并将其静态链接。仅适用于使用OpenSSL的平台。默认禁用。

  • spnego:启用SPNEGO支持。默认禁用。

  • upkeep_7_62_0:启用curl_easy_upkeep()支持,该支持自curl 7.62.0版本引入。默认禁用。

  • poll_7_68_0:启用curl_multi_poll()/curl_multi_wakeup()支持,需要curl 7.68.0或更高版本。默认禁用。

  • ntlm:在curl中启用NTLM支持。默认禁用。

  • windows-static-ssl:通过vcpkg提供的静态构建启用Windows上的OpenSSL支持。与ssl(使用--no-default-features)不兼容。默认禁用。

  • impersonate-chrome:在chrome版本中使用curl-impersonate。与static-curl不兼容,强制使用内置的BoringSSL作为TLS后端。

  • impersonate-ff:在firefox版本中使用curl-impersonate。与static-curl不兼容,强制使用内置的NSS作为TLS后端。

    请注意,要通过vcpkg在Windows上安装openssl,需要运行以下命令

    git clone https://github.com/microsoft/vcpkg
    cd vcpkg
    ./bootstrap-vcpkg.bat -disableMetrics
    ./vcpkg.exe integrate install
    ./vcpkg.exe install openssl:x64-windows-static-md
    

版本支持

这些绑定是使用curl版本7.24.0开发的。它们应该与任何新的curl版本兼容,也可能与旧版本兼容,但这尚未经过测试。

故障排除

curl使用NSS SSL库构建

如果您遇到以下错误消息

  [77] Problem with the SSL CA cert (path? access rights?)

这意味着curl可能是因为安装了libcurl NSS开发文件而链接到libcurl-nss.so,并且所需的库libnsspem.so缺失。有关更多信息,请参阅curl手册页:“如果curl是针对NSS SSL库构建的,则NSS PEM PKCS#11模块(libnsspem.so)需要可用,以便此选项正常工作。”

为了避免这种失败,您可以

  • 安装缺失的库(例如,Debian:nss-plugin-pem),或者
  • 移除libcurl NSS开发文件(例如,Debian:libcurl4-nss-dev)并重新构建curl-rust。

许可证

curl-rust存储库受MIT许可证的许可,有关详细信息,请参阅LICENSE

依赖关系

~1–14MB
~173K SLoC