9 个稳定版本
2.2.0 | 2022年7月2日 |
---|---|
2.1.0 | 2022年1月20日 |
2.0.0 | 2021年12月22日 |
1.2.2 | 2021年9月2日 |
1.0.1 | 2019年9月20日 |
#506 in 网络编程
每月下载量 23,217
用于 4 crates
文件大小 105KB
2.5K SLoC
ppp
用 Rust 编写的代理协议解析器。支持 HAProxy 报头文本和二进制版本。有关协议规范,请参阅 HAProxy。
用法
将以下内容添加到您的 Cargo.toml
作为依赖项
ppp = "2.0"
然后,您可以使用协议的文本或二进制版本。
要解析或生成文本版本,请使用
use ppp::v1;
use std::net::SocketAddr;
let client_address: SocketAddr = ...;
let server_address: SocketAddr = ...;
// Create a v1 header
let header = v1::Addresses::from((client_address, server_address)).to_string();
assert_eq!(header, v1::Header::try_from(header.as_str()).unwrap().to_string());
要解析或生成二进制版本,请使用
use ppp::v2;
use std::net::SocketAddr;
let client_address: SocketAddr = ...;
let server_address: SocketAddr = ...;
let header = v2::Builder::with_addresses(
v2::Version::Two | v2::Command::Proxy,
v2::Protocol::Stream,
(client_address, server_address),
)
.write_tlv(v2::Type::NoOp, b"Hello, World!")
.unwrap()
.build()
.unwrap();
assert_eq!(
header,
v2::Header::try_from(header.as_slice()).unwrap().as_bytes()
);
要解析任何版本,请使用
use ppp::{HeaderResult, PartialResult, v1};
let input = "PROXY UNKNOWN\r\n";
let header = HeaderResult::parse(input.as_bytes());
assert_eq!(header, Ok(v1::Header::new(input, v1::Addresses::Unknown)).into());
示例
该 仓库 包含了如何使用具有流支持的两个版本代理协议的示例。要运行示例,您需要使用 3 个终端窗口。
代理
写入代理协议报头的代理服务器将在自己的终端中。示例接受一个可选参数,指定要写入哪个版本的报头,可以是 v1
或 v2
,默认为 v2
。
版本 2
cargo run --examples one_byte
版本 1
cargo run --examples one_byte v1
服务器
一个最小的 HTTP 服务器,它读取代理协议报头并响应 HTTP 请求。
cargo run --examples server
HTTP 客户端
在本例中,我们使用 cURL
作为 HTTP 客户端,但任何 HTTP 客户端都可以。
curl -vvv https://127.0.0.1:8888/
性能分析
当前仅在 *nix 环境上支持性能分析基准运行的性能分析。性能分析器在 target
目录中输出火焰图。要运行性能分析会话,请使用
cargo bench -- --profile-time=60
基准测试
要运行基准测试,请使用
cargo bench
结果
以下是在具有超线程的六核 i7 处理器上运行的基准测试的快照。
二进制
PPP Binary/v2::Header::try_from/IPv4 with TLVs
time: [51.357 ns 52.009 ns 52.722 ns]
PPP Binary/v2::Header::as_bytes/IPv4 with TLVs
time: [515.38 ps 516.26 ps 517.48 ps]
PPP Binary/v2::Header::try_from/IPv6 without TLVs
time: [48.939 ns 49.032 ns 49.147 ns]
PPP Binary/v2::Header::as_bytes/IPv6 without TLVs
time: [514.61 ps 515.33 ps 516.42 ps]
PPP Binary/v2::Builder::build/IPv6 with TLVs
time: [1.3795 us 1.3983 us 1.4194 us]
PPP Binary/v2::Builder::build/IPv6 with TLVs with length
time: [136.72 ns 139.03 ns 141.54 ns]
文本
PPP Text/v1::Header::try_from/UNKNOWN
time: [54.173 ns 54.247 ns 54.338 ns]
PPP Text/v1::Header::try_from/TCP4
time: [217.13 ns 217.62 ns 218.33 ns]
PPP Text/v1::Header::try_from/TCP6
time: [537.42 ns 537.92 ns 538.60 ns]
PPP Text/v1::Header::try_from/TCP6 Compact
time: [395.83 ns 397.08 ns 398.96 ns]
PPP Text/v1::Header::try_from/Worst Case
time: [209.62 ns 209.75 ns 209.89 ns]
PPP Text/v1::Header::to_string/TCP4
time: [70.355 ns 70.432 ns 70.528 ns]
PPP Text/v1::Addresses::to_string/TCP4
time: [413.55 ns 415.27 ns 418.09 ns]
PPP Text/v1::Header::to_string/TCP6
time: [81.200 ns 81.421 ns 81.716 ns]
PPP Text/v1::Addresses::to_string/TCP6
time: [851.04 ns 852.34 ns 853.91 ns]
PPP Text/v1::Header::to_string/UNKNOWN
time: [72.256 ns 73.089 ns 73.979 ns]
PPP Text/v1::Addresses::to_string/UNKNOWN
time: [66.237 ns 66.305 ns 66.391 ns]
依赖关系
~305–770KB
~18K SLoC