【Rust每周“一”库】async http三剑客
发布日期:2021-05-20 06:54:48 浏览次数:18 分类:精选文章

本文共 2375 字,大约阅读时间需要 7 分钟。

好的!以下是优化后的内容:


本文是Yoshua Wuyts大体博客关于async http文章的翻译,原文地址为https://blog.yoshuawuyts.com/async-http/。

Friedel Ziegelmayer、Ryan Levick与我共同推荐一组高效的HTTP库,您可以利用它们轻松开发异步的加密HTTP/1.1服务器端和客户端。它们是:

  • async-h1:支持streaming的HTTP/1.1客户端与服务器端协议实现
  • http-types:从Tide和Surf框架中提取的可复用的HTTP组件
  • async-native-tls:支持stream与TLS的服务器端与客户端实现

通过这些库,您可以在15行代码内创建加密的基于stream的HTTP客户端,比如:

use async_std::io::prelude::*;
use async_std::net::TcpStream;
use http_types::{Method, Request, Url};
#[async_std::main]
async fn main() -> http_types::Result<()> {
// 建立TCP连接
let stream = TcpStream::connect("127.0.0.1:8080").await?;
let peer_addr = stream.peer_addr()?;
// 创建一个请求
let url = Url::parse(&format!("https://{}/foo", peer_addr))?;
let req = Request::new(Method::Get, url);
// 加密TLS连接
let host = req.url().host_str()?;
let stream = async_native_tls::connect(host, stream).await?;
// 通过加密信道发送请求
let res = async_h1::connect(stream, req).await?;
println!("{:?}", res);
Ok(())
}

而构建一个异步HTTP服务器则仅需30行代码左右(如代码中所示),大部分代码涵盖导入、循环和打印操作。

对于证书管理,只需在客户端代码中添加几行即可实现加密通信:

use async_std::fs::File;
let key = File::open("identity.pfx").await?;
let pass = "
";
let listener = TcpListener::bind("127.0.0.1:8080").await?;
let (stream, _) = listener.accept().await?;
let stream = async_native_tls::accept(key, pass, stream).await?;

STREAM的核心价值

我们的库设计专注于stream,因为Rust的stream机制提供了极高的可组合性。例如,使用surf库将HTTP请求的体复制到文件中,只需两行代码:

let req = surf::get("https://example.com").await?;
io::copy(req, File::open("example.txt")).await?;

我们希望这种可组合性不仅体现在框架层面,而是延伸到协议层面,相信通过更灵活的技术栈组件,整个生态系统将更易于使用这种异步技术。

共享抽象的重要性

最初我们使用hyperium/http库,但发现其缺乏某些关键功能,如HTTP体支持和状态码管理。因此,我们开发了http-types库,它从Tide和Surf中提取了共享组件,为异步HTTP提供了更具扩展性的抽象。

错误处理

http-types引入了一种与状态码相关的错误类型,基于David Tolnay的anyhow轻量级错误处理库。我们的Error类型可以将任何错误转化为带有状态码的错误,而ResultExt trait则提供了快速获取状态码的方法:

/// 获取文件的字节数
async fn file_length(p: Path) -> http_types::Result
{
let b = fs::read(p).await.status(501)?;
Ok(b.len())
}

TRAIT转换

我们在错误处理之外,几乎所有类型都实现了AsRefAsMut trait,这类似于rustwasm中的web-sys库,允许将各种对象作为引用传递。例如,RequestResponse都实现了这些trait,以支持灵活的操作。

兼容性

我们的技术栈兼容性强,支持通过UnixStream替换TcpStream实现跨进程通讯,无需重新编写代码或 fork 项目。同时,http-types通过实现FromInto trait,与hyperium/http库保持兼容。

设计哲学

我们的设计理念以减少障碍为导向,尝试回答诸如:异步Rust HTTP库应该长什么样?是否需要配置TCP与TLS?HTTP/1.1能否基于stream实现?我们通过极少量新trait和符合Rust命名规范的库设计,目标是在保持性能的同时,创造易于上手、使用和维护的工具。


以上为优化后的文本,您可以根据具体需求进行调整或补充!

上一篇:【Rust投稿】从零实现消息中间件-SERVER
下一篇:【Rust日报】2020-03-05 在 Flutter 插件上运行原生 Rust!

发表评论

最新留言

关注你微信了!
[***.104.42.241]2025年04月24日 01时42分17秒