|
NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
|
HTTP协议及操作 更多...
专题 | |
| WebSocket | |
| WebSocket升级协议实现 | |
类型定义 | |
| using | neforce::http::http_request = http_server_request |
| HTTP请求类型别名 | |
| using | neforce::http::http_response = http_server_response |
| HTTP响应类型别名 | |
函数 | |
| vector< byte_range > | neforce::http::parse_ranges (string_view range_header, uint64_t file_size, size_t max_ranges=100) |
| 解析HTTP Range头部值 | |
| string | neforce::http::build_content_range (const byte_range &range, uint64_t total_size) |
| 构建Content-Range头部值 | |
| string | neforce::http::build_multipart_ranges (const vector< byte_range > &ranges, string_view content_type, string_view boundary, function< string(const byte_range &)> get_range_body, uint64_t total_size=0) |
| 构建multipart/byteranges响应体 | |
变量 | |
| constexpr uint32_t | neforce::http::HTTP2_MAX_FRAME_SIZE = 16384 |
| HTTP/2 最大帧负载大小(RFC 7540 §4.1) | |
| constexpr uint32_t | neforce::http::HTTP2_DEFAULT_HEADER_TABLE_SIZE = 4096 |
| HPACK 默认动态表大小 | |
| constexpr uint32_t | neforce::http::HTTP2_DEFAULT_MAX_CONCURRENT_STREAMS = 100 |
| 默认最大并发流数 | |
| constexpr uint32_t | neforce::http::HTTP2_DEFAULT_INITIAL_WINDOW_SIZE = 65535 |
| 默认初始流控窗口 | |
| constexpr uint32_t | neforce::http::HTTP2_DEFAULT_MAX_HEADER_LIST_SIZE = 0xFFFFFFFF |
| 默认最大头部列表大小 | |
| constexpr size_t | neforce::http::HPACK_STATIC_TABLE_SIZE = 61 |
| HPACK 静态表条目数 | |
| constexpr string_view | neforce::http::HTTP2_CLIENT_PREFACE = "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" |
| HTTP/2 客户端连接前言(RFC 7540 §3.5) | |
HTTP协议及操作
本模块提供了完整的 HTTP/1.1 协议支持,涵盖客户端与服务端消息结构、Cookie与会话管理、 路由分发、中间件过滤器链以及 WebSocket 升级协议。
本实现严格遵循以下 IETF RFC 与相关标准规范:
HTTP/1.1 核心协议:
HTTP/2 核心协议:
HTTP 扩展能力:
HTTP 状态码与头字段注册:
HTTP 认证与安全:
TLS / SNI 安全传输:
Cookie 与会话管理:
CORS 跨域资源共享:
WebSocket 协议:
MIME 类型规范:
根据 RFC 9110 §15,HTTP 状态码按百位数字分类:
| 类别 | 状态码范围 | 含义 | 典型状态码 |
|---|---|---|---|
| 1xx | 100 – 199 | 信息响应 | 100 Continue, 101 Switching Protocols |
| 2xx | 200 – 299 | 成功 | 200 OK, 201 Created, 204 No Content |
| 3xx | 300 – 399 | 重定向 | 301 Moved Permanently, 302 Found, 304 Not Modified |
| 4xx | 400 – 499 | 客户端错误 | 400 Bad Request, 403 Forbidden, 404 Not Found |
| 5xx | 500 – 599 | 服务器错误 | 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable |
根据 RFC 9110 §9,本模块支持以下标准 HTTP 方法:
| 方法 | RFC 引用 | 语义 | 幂等性 | 安全性 |
|---|---|---|---|---|
| GET | §9.3.1 | 检索资源表示 | 是 | 是 |
| POST | §9.3.3 | 提交数据进行处理 | 否 | 否 |
| PUT | §9.3.4 | 替换或创建资源 | 是 | 否 |
| DELETE | §9.3.5 | 删除资源 | 是 | 否 |
| HEAD | §9.3.2 | 获取 GET 响应的头部 | 是 | 是 |
| OPTIONS | §9.3.7 | 获取服务器支持的方法 | 是 | 是 |
| TRACE | §9.3.8 | 回显请求(调试用) | 是 | 是 |
| CONNECT | §9.3.6 | 建立隧道(用于代理) | 否 | 否 |
| PATCH | RFC 5789 | 部分更新资源 | 否 | 否 |
根据 RFC 6265 §4.1,Cookie 支持以下属性:
| 属性 | 说明 |
|---|---|
| Domain | 指定 Cookie 可用的域名 |
| Path | 指定 Cookie 可用的路径前缀 |
| Expires | 指定过期时间(绝对时间) |
| Max-Age | 指定有效期(相对秒数),优先级高于 Expires |
| Secure | 仅通过 HTTPS 传输 |
| HttpOnly | 禁止 JavaScript 访问,缓解 XSS 攻击 |
| SameSite | 跨站请求策略:Strict(禁止跨站)、Lax(允许顶级导航)、None |
根据 Fetch 标准,CORS 使用以下响应头:
| 响应头 | 说明 |
|---|---|
| Access-Control-Allow-Origin | 允许访问的源 |
| Access-Control-Allow-Methods | 允许的 HTTP 方法 |
| Access-Control-Allow-Headers | 允许的请求头 |
| Access-Control-Allow-Credentials | 是否允许携带凭证(Cookie) |
| Access-Control-Max-Age | 预检请求结果缓存时间 |
根据 RFC 6455,WebSocket 协议规范:
**握手升级**:
**帧结构**(RFC 6455 §5.2):
| 字段 | 位数 | 说明 |
|---|---|---|
| FIN | 1 | 是否为消息的最后一帧 |
| RSV1-3 | 3 | 保留位,用于扩展 |
| Opcode | 4 | 帧类型:Continuation(0)、Text(1)、Binary(2)、Close(8)、Ping(9)、Pong(10) |
| MASK | 1 | 客户端到服务器的帧必须设置掩码 |
| Payload len | 7/7+16/7+64 | 负载长度 |
| Masking key | 0/32 | 掩码密钥(仅客户端帧) |
**关闭状态码**(RFC 6455 §7.4):
| 状态码 | 名称 | 说明 |
|---|---|---|
| 1000 | Normal Closure | 正常关闭 |
| 1001 | Going Away | 端点离开(如浏览器关闭) |
| 1002 | Protocol Error | 协议错误 |
| 1003 | Unsupported Data | 接收到不支持的数据类型 |
| 1008 | Policy Violation | 违反策略 |
| 1009 | Message Too Big | 消息过大 |
| 1011 | Internal Error | 服务器内部错误 |
| 特性 | 规范参数 |
|---|---|
| HTTP 版本 | HTTP/1.1(RFC 9112)与 HTTP/2(RFC 7540) |
| HTTP/2 帧层 | 9 种帧类型:DATA / HEADERS / SETTINGS / PING / GOAWAY / RST_STREAM / WINDOW_UPDATE / PRIORITY / PUSH_PROMISE |
| HPACK 头部压缩 | 静态表 61 项 + 动态表 + Huffman 编码(RFC 7541) |
| 头部字段大小写 | 不区分大小写,存储为原始大小写 |
| 分块传输编码 | 流式增量 chunked 解析,支持 Trailing Headers |
| 内容协商 | Accept-Encoding 解析,gzip/deflate 响应压缩 |
| 字节范围请求 | 单范围 206 与多范围 multipart/byteranges 206 |
| CONNECT 隧道 | 双工 TCP 隧道中继,用于 HTTPS 代理 |
| 路由匹配 | 基于 Segment Radix Tree 的 O(k) 前缀匹配;静态路径、路径参数(:id)、通配符(*)、正则表达式回退 |
| 中间件执行顺序 | 预过滤 → 核心过滤 → 路由处理 → 后过滤 |
| 会话存储 | 可插拔 session_store(内存 / Redis 后端) |
| Cookie 解析 | 支持 Set-Cookie 和 Cookie 头 |
| 会话标识符 | 支持 JESSIONID, SESSIONID, PHPSESSID 等常见名称 |
| CSRF 防护 | Double-Submit Cookie 模式,仅验证状态变更方法 |
| SNI 多证书 | 基于 TLS SNI 扩展的 hostname → SSL_CTX 映射,支持通配符 |
| IO Context | Linux epoll 边缘触发,min-heap 定时器,单线程异步 I/O |
| WebSocket 运行模式 | 线程模式(3线程/会话)和事件驱动模式(零线程)双模 |
| WebSocket 心跳 | 周期性发送 Ping 帧,等待 Pong 响应 |
| WebSocket 压缩 | permessage-deflate(RFC 7692),支持窗口比特位协商与上下文接管 |
| WebSocket 升级 | 通用 Upgrade 分发器,支持自定义协议处理器 |
|
strong |
HTTP/2 错误码(RFC 7540 §7)
在文件 http2_protocol.hpp 第 63 行定义.
|
strong |
HTTP/2 帧类型(RFC 7540 §6)
| 枚举值 | |
|---|---|
| DATA | 请求/响应体数据 |
| HEADERS | 头部块 |
| PRIORITY | 流优先级 |
| RST_STREAM | 流终止 |
| SETTINGS | 连接配置参数 |
| PUSH_PROMISE | 服务端推送承诺 |
| PING | 连接活性检测 |
| GOAWAY | 优雅关闭连接 |
| WINDOW_UPDATE | 流控窗口更新 |
| CONTINUATION | 头部块续帧 |
在文件 http2_protocol.hpp 第 43 行定义.
|
strong |
HTTP/2 SETTINGS 参数标识符(RFC 7540 §6.5.2)
| 枚举值 | |
|---|---|
| HEADER_TABLE_SIZE | HPACK 动态表最大大小 |
| ENABLE_PUSH | 是否启用服务端推送 |
| MAX_CONCURRENT_STREAMS | 最大并发流数 |
| INITIAL_WINDOW_SIZE | 流级初始窗口大小 |
| MAX_FRAME_SIZE | 最大帧负载大小 |
| MAX_HEADER_LIST_SIZE | 最大头部列表大小 |
在文件 http2_protocol.hpp 第 83 行定义.
|
strong |
负载均衡策略
| 枚举值 | |
|---|---|
| ROUND_ROBIN | 轮询 |
| LEAST_CONNECTIONS | 最少连接 |
| WEIGHTED | 加权轮询 |
| RANDOM | 随机 |
在文件 load_balancer.hpp 第 28 行定义.
| string neforce::http::build_content_range | ( | const byte_range & | range, |
| uint64_t | total_size ) |
构建Content-Range头部值
| range | 字节范围 |
| total_size | 总大小 |
被这些函数引用 build_content_range().
| string neforce::http::build_multipart_ranges | ( | const vector< byte_range > & | ranges, |
| string_view | content_type, | ||
| string_view | boundary, | ||
| function< string(const byte_range &)> | get_range_body, | ||
| uint64_t | total_size = 0 ) |
构建multipart/byteranges响应体
| ranges | 多个字节范围 |
| content_type | 文件的MIME类型 |
| boundary | MIME分隔边界字符串 |
| get_range_body | 获取指定范围内容的回调函数 |
| total_size |
被这些函数引用 build_multipart_ranges().
| vector< byte_range > neforce::http::parse_ranges | ( | string_view | range_header, |
| uint64_t | file_size, | ||
| size_t | max_ranges = 100 ) |
解析HTTP Range头部值
| range_header | Range头部值(不含"bytes="前缀) |
| file_size | 文件总大小 |
| max_ranges | 最大允许的范围数量,超出时拒绝整个请求 |
引用了 parse_ranges().
被这些函数引用 parse_ranges().