#protocols #header #proxy #proxy-server #parser #binary #version

ppp

用 Rust 编写的代理协议解析器。有关协议规范,请参阅 HAProxy。

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 网络编程

Download history 2801/week @ 2024-03-14 3048/week @ 2024-03-21 3076/week @ 2024-03-28 3223/week @ 2024-04-04 4878/week @ 2024-04-11 5739/week @ 2024-04-18 5610/week @ 2024-04-25 5398/week @ 2024-05-02 3741/week @ 2024-05-09 4930/week @ 2024-05-16 5780/week @ 2024-05-23 3394/week @ 2024-05-30 5859/week @ 2024-06-06 5379/week @ 2024-06-13 5974/week @ 2024-06-20 5343/week @ 2024-06-27

每月下载量 23,217
用于 4 crates

Apache-2.0 协议

文件大小 105KB
2.5K SLoC

ppp

License Crates.io Version Docs.rs Version

用 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 个终端窗口。

代理

写入代理协议报头的代理服务器将在自己的终端中。示例接受一个可选参数,指定要写入哪个版本的报头,可以是 v1v2,默认为 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