Coding的痕迹

一位互联网奔跑者的网上日记

0%

Actix-web::Client (awc) 基于 rustls 使用 HTTPS

   和使用 http 类似,测试代码可以这样写:

1
2
3
4
5
6
7
8
9
10
11
12
13
use actix_web::client::Client;

#[actix_rt::main]
async fn main() {
let mut client = Client::default();

// Create request builder and send request
let response = client.get("https://sunnysab.cn")
.send().await.unwrap();

println!("{:?}", response);

}

   然后编译运行,会 panic。崩溃提示:

1
2
3
4
5
6
7
8
9
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Connect(SslIsNotSupported)', src\main.rs:34:20
stack backtrace:
0: backtrace::backtrace::trace_unsynchronized
at C:\Users\VssAdministrator\.cargo\registry\src\github.com-1ecc6299db9ec823\backtrace-0.3.40\src\backtrace\mod.rs:66
1: std::sys_common::backtrace::_print_fmt
at /rustc/b8cedc00407a4c56a3bda1ed605c6fc166655447\/src\libstd\sys_common\backtrace.rs:77
2: std::sys_common::backtrace::_print::{{impl}}::fmt
at /rustc/b8cedc00407a4c56a3bda1ed605c6fc166655447\/src\libstd\sys_common\backtrace.rs:59
// 省略

   actix-web 提供了两种 SSL 库的支持,OpenSSL 和 rustls。我在用 vcpkg install openssl 折腾了一个小时后,选择了 rustls。rustls 十分简单,据评测性能比前者更好。打开 Cargo.toml,插入:

1
actix-web = { version = "2.0", features = ["rustls"] }

   就可以了。

    与个人证书、不安全连接相关的需求,可用参考这个单元测试的内容:

https://github.com/actix/actix-web/blob/master/awc/tests/test_rustls_client.rs

   刚开始的时候没有找到相关的 Guide, 在 Google 的时候发现在 actix-web 仓库中有与 rustls 相关的一条 pull request 和一个 issue,不过没有给出可用的代码。参阅了 Github 上 AWC 相关的单元测试

1
2
3
4
5
6
7
8
// 代码片段
let client = awc::Client::build()
.connector(awc::Connector::new().ssl(builder.build()).finish())
.finish();

let request = client.get(srv.surl("/")).send();
let response = request.await.unwrap();
assert!(response.status().is_success());

   便以这个思路改了半天,如把 ssl() 替换成 rustls(),费了不少功夫。

希望收获一份惊喜