Skip to content

HTTP 配置与进阶使用

查看 Markdown

客户端与服务端示例提供完整的启动、收发与关闭程序。以下配置在相应对象启动前应用,除非另有说明。

消息、回调与所有权

客户端接收 response<string_body>&;服务端接收 Session 引用和 request<string_body>&。引用只在回调期间有效,保留前必须复制或移动。 接受入队的发送持有序列化消息至完成,调用方之后修改原对象不会改变排队消息。

修改 body 后调用 prepare_payload(),或明确配置 chunked 拆包。 写完成统计 HTTP 线上字节,包括头部;不代表对端已收到或处理请求。 立即拒绝和已入队完成遵循公共发送约定。

Keep-Alive 与流水线

同一连接可连续排队多个请求。客户端按请求顺序匹配响应,跳过信息响应后报告 最终响应。服务端应用必须按请求顺序发送响应。路由框架的同步处理自然保持顺序; 将业务移到其他线程后,需要恢复响应顺序再发送。

HEAD 响应没有 body,可用 empty_body 响应声明表示资源的 Content-Length。 需要 EOF 的响应在写完后关闭连接,后续排队发送以取消完成。 服务端收到 Expect: 100-continue 时,先发送信息响应再等 body。

上限与错误

启动前配置 set_http_header_limit(bytes) 和 set_http_body_limit(bytes)。 默认分别为 8192 字节和 16 MiB。读取中修改上限从下一条消息的解析器生效。 解析/拆包错误和超限消息会关闭连接。404 等状态是正常 HTTP 响应, 业务应检查 response.result()。

连接错误通过 bind_disconnect 和回调线程中的 get_last_error() 检查。 一次性请求可以关闭自动重连。重连不会自动重放业务请求。

HTTPS 服务端与客户端

开启 ARKNET_ENABLE_SSL=ON 后,对服务端和客户端完整程序作以下修改,即可用于 HTTPS。保留请求与响应回调、回显验证和关闭代码。以下公开测试证书与私钥只用于本地测试;部署时应使用实际服务的证书和 CA 信任。证书路径及 mTLS 配置见 TLS 示例。

在服务端程序中,将头文件替换为 <arknet/http/https_server.hpp>,并将服务端声明替换为:

arknet::https_server server;
server.set_cert_file("", "tests/certs/server.pem", "tests/certs/server-key.pem", "");
if (arknet::get_last_error())
{
    std::cerr << arknet::get_last_error().message() << '\n';
    return 1;
}

改用 server.start("127.0.0.1", 8443) 监听,并将输出 URL 改为 https://localhost:8443/echo。

在客户端程序中,将头文件替换为 <arknet/http/https_client.hpp>,并将客户端声明替换为:

arknet::https_client client;
arknet::error_code error;
client.load_verify_file("tests/certs/ca.pem", error);
if (error)
{
    std::cerr << error.message() << '\n';
    return 1;
}

改用 client.start("localhost", 8443) 连接,并将请求 Host 字段设为 "localhost:8443"。连接名称决定 DNS/IP 身份校验;HTTP Host 头不会改变 TLS 身份。客户端默认校验证书链和连接名称。在仓库根目录运行程序,以便解析测试证书路径。

自定义 Session

自定义 Session 继承 http_session_t<MySession>, 交给 http_server_t<MySession>;HTTPS 提供对应的 https_* 形式。 HTTP 测试 覆盖独立 raw 对端的 chunked、HEAD、上限、Expect 和流水线。

路由与业务处理

http_router 提供方法/路径分发与中间件。 路由回调在接收 lane 同步执行。较长 CPU 或阻塞任务需要应用工作池、 有界业务排队和响应排序,见 IO 模型。

Navigation

Type to search…

↑↓ navigate↵ selectEsc close