完善https代理功能
ylong_http 是 OpenHarmony 官方原生的 Rust 网络协议栈,为系统应用与三方应用提供完整的 HTTP/1.1、HTTP/2、HTTP/3 客户端能力,包括连接池管理、TLS 握手、代理转发、重试/重定向等核心功能。本仓库在原有开源基线之上,面向赛题场景完成了三项能力补齐与性能优化工作。
ylong_http
赛题启动时,ylong_http 存在三项明确的能力缺口:
HTTPS 代理能力缺失:原代理链路仅支持客户端经由明文 TCP 到达 HTTP 代理,无法对接 https://proxy:port 形式的 HTTPS 代理;代理侧 OpenSSL FFI 层缺少私钥加载与校验接口,TlsConfigBuilder 与 ProxyBuilder 均不具备代理专属 TLS 配置(mTLS、ALPN 协商等)能力。
https://proxy:port
TlsConfigBuilder
ProxyBuilder
代理逻辑与核心连接器高度耦合:代理地址判断、CONNECT 隧道协商、代理侧 TLS 握手等逻辑全部内联在 HttpConnector 中,没有统一的代理抽象接口;HTTP/1 编码层通过反查 is_proxy: bool 决定请求行格式,协议语义不清晰,扩展新代理协议需在核心流程中堆叠分支。
HttpConnector
is_proxy: bool
HTTPS 代理场景性能与 libcurl 存在差距:原实现对每次请求均重新执行 TCP/TLS/H2 三次握手,缺少代理侧 H2 连接复用与 TLS 会话恢复,在 HTTPS 代理基准场景下吞吐与延迟均落后于 libcurl,赛题要求实现 20%+ 性能提升。
针对上述三项缺口,按赛题子任务顺序完成了如下工作:
SSL_CTX_use_PrivateKey_file
SSL_CTX_check_private_key
private_key_file()
build()
tls_ca_cert()
tls_client_cert()
tls_private_key()
tls_cipher_list()
tls_alpn_protos()
async_impl/connector
ProxyStream
MixStream
TCP → TLS(代理) [ProxyStream::Tls] → CONNECT → TLS(目标) [MixStream::Https]
ProxyStrategy
async_impl/proxy_strategy.rs
connect()
forward()
try_forward_with_cached_session()
HttpProxy
HttpsProxy
ProxyFactory
RequestRoute
Direct / ForwardProxy / Tunnel
OuterProxyH2Pool
H2LoadSnapshot
poll_shutdown()
ConnLifecycle
ConnectionAborted
基准测试环境:基于 Docker Compose 的三容器隔离环境(bench_client / bench_proxy / bench_origin),通过 tc netem 统一注入 RTT,同一条件下对比 ylong 与 libcurl。
bench_client
bench_proxy
bench_origin
tc netem
代表性结果(c128 并发 / 128 KB 负载 / RTT 20 ms 复合场景):RPS 较 libcurl **+77.6%**,P99 延迟 **-86.9%**;综合各场景平均 RPS 提升超过 **20%**,达成赛题目标。
. ├── ylong_http/ # 协议层:URI、Header、Body 编解码,H1/H2/H3 帧处理 ├── ylong_http_client/ # 客户端层:连接池、connector、代理策略、TLS 适配 │ └── src/ │ ├── async_impl/ # 异步客户端实现 │ │ ├── client.rs # Client / ClientBuilder │ │ ├── pool.rs # 连接池(H2 生命周期、负载感知) │ │ ├── proxy_strategy.rs # 代理策略(ProxyStrategy / ProxyFactory / OuterProxyH2Pool) │ │ ├── mix.rs # 流类型(ProxyStream / MixStream / H2TunnelStream) │ │ ├── connector/ # 连接建立与代理调度 │ │ ├── conn/ # 协议收发(HTTP/1、HTTP/2、HTTP/3) │ │ └── ssl_stream/ # 异步 TLS 适配层 │ └── util/ │ ├── c_openssl/ # OpenSSL FFI 封装(含私钥加载与校验) │ ├── config/ # 配置选项(TlsConfigBuilder、ProxyBuilder 等) │ └── information.rs # ConnData / RequestRoute └── ylong-curl-proxy-benchmark/ # 基准测试框架(Docker 三容器 + ylong/curl 驱动)
本项目遵循 Apache License 2.0。
基于 ylong-http 现有架构,使用 Rust 补齐 HTTPS 代理功能
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
ylong_http — OpenHarmony 原生 Rust HTTP 协议栈
简介
ylong_http是 OpenHarmony 官方原生的 Rust 网络协议栈,为系统应用与三方应用提供完整的 HTTP/1.1、HTTP/2、HTTP/3 客户端能力,包括连接池管理、TLS 握手、代理转发、重试/重定向等核心功能。本仓库在原有开源基线之上,面向赛题场景完成了三项能力补齐与性能优化工作。项目背景
赛题启动时,ylong_http 存在三项明确的能力缺口:
HTTPS 代理能力缺失:原代理链路仅支持客户端经由明文 TCP 到达 HTTP 代理,无法对接
https://proxy:port形式的 HTTPS 代理;代理侧 OpenSSL FFI 层缺少私钥加载与校验接口,TlsConfigBuilder与ProxyBuilder均不具备代理专属 TLS 配置(mTLS、ALPN 协商等)能力。代理逻辑与核心连接器高度耦合:代理地址判断、CONNECT 隧道协商、代理侧 TLS 握手等逻辑全部内联在
HttpConnector中,没有统一的代理抽象接口;HTTP/1 编码层通过反查is_proxy: bool决定请求行格式,协议语义不清晰,扩展新代理协议需在核心流程中堆叠分支。HTTPS 代理场景性能与 libcurl 存在差距:原实现对每次请求均重新执行 TCP/TLS/H2 三次握手,缺少代理侧 H2 连接复用与 TLS 会话恢复,在 HTTPS 代理基准场景下吞吐与延迟均落后于 libcurl,赛题要求实现 20%+ 性能提升。
我们的工作
针对上述三项缺口,按赛题子任务顺序完成了如下工作:
子任务 1 · 补齐 HTTPS 代理支持
SSL_CTX_use_PrivateKey_file/SSL_CTX_check_private_keyFFI 绑定,打通代理侧 mTLS 所需的底层密钥加载与校验链路。TlsConfigBuilder扩展:新增private_key_file()接口,支持客户端证书 + 私钥完整材料的配置,并在build()中执行一致性校验。ProxyBuilder代理专属 TLS 配置:新增tls_ca_cert()、tls_client_cert()、tls_private_key()、tls_cipher_list()、tls_alpn_protos()等细粒度接口,代理侧与目标站 TLS 配置严格隔离。async_impl/connector中实现了ProxyStream(代理阶段 I/O)与MixStream(目标阶段 I/O)分层,支持 HTTP/HTTPS 目标均可经由 HTTPS 代理(含 H2 CONNECT 隧道)转发:子任务 2 · 代理功能模块化重构
ProxyStrategytrait:新增async_impl/proxy_strategy.rs,定义统一的代理策略接口(connect()、forward()、try_forward_with_cached_session()等),HttpProxy/HttpsProxy各自实现,新增代理协议只需实现该 trait,核心连接器无需改动。ProxyFactory工厂:根据代理 scheme 自动创建对应策略实例,HttpConnector收敛为调度器,不再内联代理细节。RequestRoute枚举:用Direct / ForwardProxy / Tunnel取代is_proxy: bool,HTTP/1 编码层只消费路由语义,彻底消除代理类型与编码格式的隐式耦合。OuterProxyH2Pool**:代理侧 H2 session 复用池,支持按连接负载感知选择(H2LoadSnapshot),避免重复握手。子任务 3 · HTTPS 代理场景性能优化
OuterProxyH2Pool缓存并复用代理 H2 session,新请求直接在已有连接上开 CONNECT streampoll_shutdown(),避免替换连接与写回产生竞态ConnLifecycle(Alive/Draining/Dead)+ 跳感知的替换策略,消除向僵死连接发送请求H2LoadSnapshot指标选取压力最低的连接ConnectionAborted自动新建连接重发基准测试环境:基于 Docker Compose 的三容器隔离环境(
bench_client/bench_proxy/bench_origin),通过tc netem统一注入 RTT,同一条件下对比 ylong 与 libcurl。代表性结果(c128 并发 / 128 KB 负载 / RTT 20 ms 复合场景):RPS 较 libcurl **+77.6%**,P99 延迟 **-86.9%**;综合各场景平均 RPS 提升超过 **20%**,达成赛题目标。
目录结构
许可证
本项目遵循 Apache License 2.0。