模块契约HTTP 协议底座
线程
解析、编码与字段表 API 为无共享状态的纯函数或单拥有者对象,可任意线程并发调用(不同对象间);同一对象(连接、字段表)由使用它的执行流独占。
模块边界
| 模块 | 裁剪宏 | 作用 |
|---|---|---|
http | XRT_MODULE_HTTP | token、字段、方法、状态和 Content-Length |
http_param | XRT_MODULE_HTTP_PARAM | 参数与 quoted-string 语法 |
http_param_host | XRT_MODULE_HTTP_PARAM_HOST | 参数解码后的无分配 Host 验证 |
http_expect | XRT_MODULE_HTTP_EXPECT | Expect 字段 |
http_upgrade | XRT_MODULE_HTTP_UPGRADE | Upgrade 字段与写出 |
http_te | XRT_MODULE_HTTP_TE | TE 与 transfer-coding 参数 |
http_connection | XRT_MODULE_HTTP_CONNECTION | Connection 选项与持久连接 |
http_trailer | XRT_MODULE_HTTP_TRAILER | Trailer 声明和尾字段约束 |
http_encoding | XRT_MODULE_HTTP_ENCODING | Accept-Encoding 与 Content-Encoding |
http_decode | XRT_MODULE_HTTP_DECODE | 流式 gzip/deflate 自动解码 |
http_host | XRT_MODULE_HTTP_HOST | Host authority |
http_target | XRT_MODULE_HTTP_TARGET | 四种 request-target |
http1_head | XRT_MODULE_HTTP1_HEAD | 起始行、Header 解析与写入 |
http1_net | XRT_MODULE_HTTP1_NET | TCP 块链 Header 解析与余量保留 |
http1_tls | XRT_MODULE_HTTP1_TLS | TLS 明文块链增量 Header 解析 |
http1_body | XRT_MODULE_HTTP1_BODY | 正文计划、chunked 和 trailer |
http1_message | XRT_MODULE_HTTP1_MESSAGE | 连续内存完整消息便利层 |
http_decode 才依赖 Inflate,http1_net 才依赖网络块链,http1_tls 才依赖 TLS Stream。 只启用连续内存 HTTP/1 解析不会带入压缩、网络、TLS 或 WebSocket。
借用模型
xhttpfield、xhttp1head、xhttp1message 和所有语法游标都借用调用方输入。 解析器不复制字段名称和值,输入缓冲和字段描述符数组必须覆盖借用视图的使用期。
请求方法同时以原始 xhttp1head.Method 视图和 xhttp1head.MethodCode 枚举发布。 xrtHttpMethodParse 按大小写敏感规则识别 GET、HEAD、POST、PUT、DELETE、CONNECT、 OPTIONS、TRACE 和 PATCH;合法但未内置的方法返回 XHTTP_METHOD_OTHER,非法 token 返回 XHTTP_METHOD_INVALID。每个非零枚举值占用独立 bit,既可以作为实际方法直接 比较,也可以通过位或组合成路由方法集合。XHTTP_METHOD_CRUD 覆盖 GET、POST、PUT、 PATCH 和 DELETE,XHTTP_METHOD_ANY 覆盖全部内置方法及 OTHER;应用仍应保留原始 视图处理具体的扩展方法。
字段描述符允许位于合法的未对齐存储。实现使用安全加载,不要求调用方为了协议 解析调整缓冲布局。
XRT 不再提供动态 Header 容器。需要拥有、修改或索引 Header 的框架应在 xhttp 中建立对象模型;快速路径可以直接使用栈数组或应用自己的存储。
Host 语法
xrtHttpHostParse 保留 Host、可选端口和 IP-literal 分类,任意长度十进制端口在 协议层仍然合法,只有可放入 uint16 的值才带 XHTTP_AUTHORITY_PORT_VALUE。 xrtHttpIpv4Valid 与 xrtHttpIpv6Valid 是无错误副作用的纯谓词,公开同一套严格 IP 文本规则,扩展协议无需复制 Host 内部解析器。
xrtHttpParamHostValid 直接消费 xhttpparam 的语义值。quoted-pair 会在验证时 流式解码,任意长度 reg-name 与 IPvFuture 不进入固定缓冲,也不申请堆内存。
Header 解析
xrtHttp1RequestParse 和 xrtHttp1ResponseParse 接受从消息首字节开始的累计输入:
XHTTP1_MORE:输入尚未包含完整 Header;XHTTP1_FIELDS:Header 完整,但字段描述符容量不足,FieldCount给出需求;XHTTP1_READY:解析完成;XHTTP1_ERROR:协议、限额或参数错误。
解析器只接受 CRLF,拒绝 obs-fold、裸 LF、非法字段名、控制字符、冲突的 Content-Length、歧义 Transfer-Encoding 和非法 Upgrade。xhttp1errorinfo 提供稳定错误码、消息相对偏移和行号。
xhttp1limits 分别限制 Header 总长度、起始行、单字段行和字段数量。默认值面向 公网输入,服务端应按路由策略进一步收紧,而不是无上限增长接收缓冲。
网络热路径使用 xrtHttp1RequestParseBuffer、xrtHttp1ResponseParseBuffer 直接扫描 xnetbuf。只有完整 Header 跨块时才连续化实际 Header 前缀,函数不消费输入,Upgrade 后的余量 保持原位。TLS 对应入口是 xrtHttp1RequestParseTls、xrtHttp1ResponseParseTls;输入不足时它们 通过 xrtTlsStreamReadMore 请求下一段受限明文,Header 完成后仍由调用方消费 Head.Bytes。
正文计划
Header 完成后必须调用:
xrtHttp1RequestBodyPlan处理请求;xrtHttp1ResponseBodyPlan处理响应,并传入原请求方法。
xhttp1bodyplan 的模式是唯一分帧结论:
XHTTP1_BODY_NONE:没有正文;XHTTP1_BODY_FIXED:Content-Length 定长;XHTTP1_BODY_CHUNKED:分块编码;XHTTP1_BODY_CLOSE:由可靠 EOF 定界;XHTTP1_BODY_TUNNEL:CONNECT 或 101 后的字节不再属于 HTTP。
响应计划覆盖 HEAD、成功 CONNECT、1xx、204 和 304。调用方不应仅凭 Content-Length 判断响应正文。
流式接收
xrtHttp1BodyInit 创建无分配 reader。xrtHttp1BodyRead 每次返回一个借用正文 片段、容量请求或终态,并通过 Consumed 精确说明已消费线路字节。
xrtHttp1BodyLimitsInit 的 MaxBody 默认为 UINT64_MAX,因为底层 reader 不拥有、 聚合或分配正文。服务端、代理以及任何会持有正文的上层必须在接收前按路由和内存预算 设置有限上限,不能把该协议层默认值直接作为公网接收策略。
对于 chunked,reader 会验证 chunk-size、扩展语法、CRLF、last-chunk 和 trailer, 并严格拒绝 chunk-size 与分号或 CRLF 之间的空白,避免端点对报文边界产生分歧。 正文视图不包含分块元数据。Received 是应用正文长度,WireBytes 是正文区实际 线路长度。
当返回 XHTTP1_BODY_FIELDS 时,TrailerCount 给出所需描述符数量。调用 xrtHttp1BodyTrailers 绑定足够存储后,用同一输入继续解析,不会丢失进度。
close-delimited 模式只有在传输层给出可靠 EOF 时才传入 bEnd = true。超时、取消、 RST 和普通 EOF 不能混为同一种上层状态。
gzip 自动解码
xrtHttpDecodeCreate 直接读取解析后的字段数组。把 xrtHttp1BodyRead 发布的每个 正文片段交给 xrtHttpDecodeWrite,并只在 body reader 完成时设置 bFinal。
identity 和显式原样回退路径不复制输入。gzip/deflate 路径按 Content-Encoding 逆序流式解码,验证 gzip Header、CRC、ISIZE 和压缩流终态。每个中间层与最终 输出都受同一明文硬限额约束。
详见 HTTP 正文解码。
原始写出
xrtHttp1RequestWrite 和 xrtHttp1ResponseWrite 不添加 Host、Date、Server 或其他 策略字段。空输出用于精确测量,容量不足不会产生半个 Header。
高性能发送建议:
1. 在连接或协程栈上的小缓冲中写 Header; 2. 用 xrtNetStreamSendVec 一次提交 Header 与小正文; 3. 大正文用 xrtNetStreamSendRef、SendRefs、SendTake 或 SendBuffer; 4. chunked 正文只用 xrtHttp1ChunkLineWrite 生成短前缀,数据本身保持引用发送; 5. XNET_RESULT_AGAIN 时等待 writable/drain,不绕过网络队列硬上限。
这条路径只构造必需的线路字节,不创建请求、响应、字典或正文对象。
报文长度
xhttp1head.Bytes:起始行、Header 和最终空行的线路长度;xhttp1bodyplan.Length:定长正文长度,仅在FIXED模式有效;xhttp1body.Received:已经发布的应用正文长度;xhttp1body.WireBytes:已经消费的正文线路长度;xhttp1message.Wire.Size:连续输入中第一条完整消息的线路总长度;xhttp1message.BodyBytes:移除 chunked 元数据后的正文长度。
chunked 和 close-delimited 消息在完成前不存在可提前得知的总线路长度。
TLS 与 Upgrade
HTTP 不拥有 TLS。http1_tls 只是块链适配器,不创建连接或安全策略;证书验证、SNI、会话恢复和 ALPN 仍属于通用 TLS 模块。它按需连续化实际 Header,不增加连接级固定缓冲。
xrtHttpUpgrade*、xrtHttpConnection* 和 WebSocket 握手函数共同完成 Upgrade 验证。101 后的剩余字节必须原样交给新协议,不能继续送入 HTTP body reader。
完整消息便利层
xrtHttp1RequestMessageParse 和 xrtHttp1ResponseMessageParse 适合已经连续驻留在 内存中的报文、测试和协议网关。它们仍只借用输入,不持有堆对象。
固定长度或 close-delimited 正文可由 xrtHttp1MessageBodyView 直接查看;chunked 正文使用 xrtHttp1MessageBodyCopy 去除分帧。真正的网络热路径应优先使用流式 body reader,避免等待和复制整个消息。
扩展库边界
客户端池、重定向、重试、缓存、认证、Cookie、MIME、Multipart、FormData、SSE、 服务器路由和中间件属于独立发布的 xhttp 扩展;它们不参与 XRT 核心构建、单头包或 兼容性承诺。
字段
xhttpfield 只有 Name 和 Value 两个借用视图。字段名称不带冒号,字段值不带 两端 OWS 或 CRLF。
xrtHttpFieldParse 解析一条不含 CRLF 的字段行;xrtHttpFieldNext 逐行扫描字段 块;xrtHttpFieldBlockCount 在不保存描述符时完成严格验证和计数。
xrtHttpFieldWrite 写一条字段,xrtHttpFieldBlockWrite 写字段数组和可选最终空行。 两者都支持空输出测量,容量不足时不会部分写出。
查询函数包括:
xrtHttpFieldNameEqual:ASCII 不区分大小写字段名比较;xrtHttpFieldFind、Get、Count:查找重复字段;xrtHttpFieldGetUnique:区分缺失、唯一和重复;xrtHttpFieldValueValid:验证字段值字节边界。
字段描述符可以未对齐,但描述符数组、借用文本和写出区不能发生不明确重叠。
Content-Length
xrtHttpContentLengthParse 接受十进制值和 RFC 允许的重复相同列表值,拒绝空值、 符号、非数字、溢出和冲突值。
该函数只解析单个字段值。HTTP/1 parser 会合并全部重复 Content-Length 字段, 同时执行 Transfer-Encoding 冲突和请求分帧检查。
token 与列表
xrtHttpTokenValid验证 RFC tchar;xrtHttpTokenEqual和xrtHttpMethodEqual执行 ASCII 不区分大小写比较;xrtHttpTokenNext迭代逗号 token-list;xrtHttpFieldTokenNext跨重复同名字段迭代;xrtHttpFieldTokenCount、Find处理重复字段集合;xrtHttpQualityParse解析 0 到 1 的 qvalue 为 0 到 1000 定点数;xrtHttpWeightedTokenNext迭代带权 token。
xrtHttpOwsTrim 只移除 SP 和 HTAB,不把其他空白字符当作 HTTP OWS。
方法与状态
xrtHttpStatusText 返回内置状态的标准 reason phrase。未知状态返回空视图,调用方 仍可用 uint16 写出扩展状态。
xrtHttpMethodSafe、xrtHttpMethodIdempotent 和 xrtHttpResponseContentAllowed 提供基础协议语义。它们不替代应用权限、重试和 缓存策略。
参数
启用 XRT_MODULE_HTTP_PARAM 后,xhttpparam 表达 name[=value]:
XHTTP_PARAM_HAS_VALUE:存在等号和值;XHTTP_PARAM_QUOTED:值来自 quoted-string,视图不含外层双引号;XHTTP_PARAM_NONE:只有名称。
xrtHttpParamNext 迭代分号参数,xrtHttpDirectiveNext 迭代逗号指令。对应的 Count 和 Find 函数使用同一套严格语法。
xrtHttpQuotedValid、Read、Write 处理 quoted-string 和 quoted-pair; xrtHttpParamValueCursorInit 与 xrtHttpParamValueNext 零分配逐字节读取语义值, 并通过 Offset 暴露已经消耗的原始值长度;xrtHttpParamValueWrite 一次性输出 参数语义值;xrtHttpParamWrite 写单个参数。
Build 便利函数返回由 xrtFree 释放的零结尾字符串。热路径应优先使用测量加 调用方缓冲的 Write 版本。
Host 与 request-target
启用 http_host 后,xrtHttpHostParse 返回借用的 xhttpauthority; xrtHttpHostValid 执行同样的严格验证。解析过程不分配内存,IPv6 与 IPvFuture 字面地址的 Host 视图不包含方括号,PortText 保留显式端口的原始文本。
xrtHttpAuthorityValid 验证解析或手工构造的 authority。手工构造数值端口时设置 XHTTP_AUTHORITY_HAS_PORT | XHTTP_AUTHORITY_PORT_VALUE 并填写 Port,不需要伪造 PortText。xrtHttpAuthorityPort 将可用的显式端口写入调用方变量;省略端口或显式 空端口时返回调用方提供的默认值,超出 uint16 的合法协议端口文本不能直接交给 网络层,因此返回失败。
xrtHttpTargetParse 区分 origin-form、absolute-form、authority-form 和 asterisk-form,并结合方法检查 CONNECT 与 OPTIONS 的专用约束。结果同样只借用输入, 核心层不构建 URL 对象,也不执行查询参数解码。
已迁出能力
动态 Header 容器、RFC 8187 扩展值、MIME、Structured Fields、Digest Fields、 Forwarded、Link、Priority、Cache-Status、Proxy-Status 和 Content-Disposition 不属于 XRT HTTP 核心;需要这些高级协议能力时,请使用独立发布的 xhttp 扩展。
xhttpmethod类型
常用 HTTP 方法使用互不重叠的单 bit 枚举值。非零值既表示一个解析后的 方法,也可以作为方法集合中的原子位;组合宏提供常用路由方法集合。 OTHER 表示语法合法但未内置分类的方法;INVALID 表示空值或非法 token, 在方法集合中也自然表示不匹配任何方法。
| 值 | 语义 |
|---|---|
XHTTP_METHOD_INVALID | 无效 |
XHTTP_METHOD_OTHER | 扩展/未知方法 |
XHTTP_METHOD_GET | GET 方法 |
XHTTP_METHOD_HEAD | HEAD 方法 |
XHTTP_METHOD_POST | POST 方法 |
XHTTP_METHOD_PUT | PUT 方法 |
XHTTP_METHOD_DELETE | DELETE 方法 |
XHTTP_METHOD_CONNECT | CONNECT 方法 |
XHTTP_METHOD_OPTIONS | OPTIONS 方法 |
XHTTP_METHOD_TRACE | 最详细级别 |
XHTTP_METHOD_PATCH | PATCH 方法 |
xhttpversion类型
HTTP 版本使用可直接比较的主次版本编码。
| 值 | 语义 |
|---|---|
XHTTP_VERSION_1_0 | HTTP/1.0 |
XHTTP_VERSION_1_1 | HTTP/1.1 |
xhttpstatus类型
HTTP 状态常量只收录 IANA 已正式分配的通用状态。 未分配、临时分配和明确标记为 Unused 的数值仍可直接使用 uint16 表达。
| 值 | 语义 |
|---|---|
XHTTP_STATUS_CONTINUE | CONTINUE(100 继续) |
XHTTP_STATUS_SWITCHING_PROTOCOLS | 101 协议切换 |
XHTTP_STATUS_PROCESSING | 102 处理中 |
XHTTP_STATUS_EARLY_HINTS | 103 早期提示 |
XHTTP_STATUS_OK | 成功 |
XHTTP_STATUS_CREATED | 201 已创建 |
XHTTP_STATUS_ACCEPTED | 202 已接受 |
XHTTP_STATUS_NON_AUTHORITATIVE_INFORMATION | 203 非权威信息 |
XHTTP_STATUS_NO_CONTENT | 204 无内容 |
XHTTP_STATUS_RESET_CONTENT | 205 重置内容 |
XHTTP_STATUS_PARTIAL_CONTENT | 206 部分内容 |
XHTTP_STATUS_MULTI_STATUS | 207 多状态 |
XHTTP_STATUS_ALREADY_REPORTED | 208 已报告 |
XHTTP_STATUS_IM_USED | 226 IM 已使用 |
XHTTP_STATUS_MULTIPLE_CHOICES | 300 多选项 |
XHTTP_STATUS_MOVED_PERMANENTLY | 301 永久移动 |
XHTTP_STATUS_FOUND | 302 找到(临时移动) |
XHTTP_STATUS_SEE_OTHER | 303 见其他 |
XHTTP_STATUS_NOT_MODIFIED | 304 未修改 |
XHTTP_STATUS_USE_PROXY | 305 使用代理 |
XHTTP_STATUS_TEMPORARY_REDIRECT | 307 临时重定向 |
XHTTP_STATUS_PERMANENT_REDIRECT | 308 永久重定向 |
XHTTP_STATUS_BAD_REQUEST | 400 错误请求 |
XHTTP_STATUS_UNAUTHORIZED | 401 未认证 |
XHTTP_STATUS_PAYMENT_REQUIRED | 402 需要付费 |
XHTTP_STATUS_FORBIDDEN | 403 禁止 |
XHTTP_STATUS_NOT_FOUND | 未找到 |
XHTTP_STATUS_METHOD_NOT_ALLOWED | 405 方法不允许 |
XHTTP_STATUS_NOT_ACCEPTABLE | 406 不可接受 |
XHTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED | 407 需代理认证 |
XHTTP_STATUS_REQUEST_TIMEOUT | REQUEST超时 |
XHTTP_STATUS_CONFLICT | 冲突 |
XHTTP_STATUS_GONE | 410 已消失 |
XHTTP_STATUS_LENGTH_REQUIRED | 411 需要 Content-Length |
XHTTP_STATUS_PRECONDITION_FAILED | PRECONDITION已失败 |
XHTTP_STATUS_CONTENT_TOO_LARGE | 413 内容过大 |
XHTTP_STATUS_URI_TOO_LONG | 414 URI 过长 |
XHTTP_STATUS_UNSUPPORTED_MEDIA_TYPE | 不支持MEDIA类型 |
XHTTP_STATUS_RANGE_NOT_SATISFIABLE | 范围越界NOTSATISFIABLE |
XHTTP_STATUS_EXPECTATION_FAILED | EXPECTATION已失败 |
XHTTP_STATUS_MISDIRECTED_REQUEST | 421 请求被误送 |
XHTTP_STATUS_UNPROCESSABLE_CONTENT | 422 无法处理 |
XHTTP_STATUS_LOCKED | 423 已锁定 |
XHTTP_STATUS_FAILED_DEPENDENCY | 已失败DEPENDENCY |
XHTTP_STATUS_TOO_EARLY | 425 过早 |
XHTTP_STATUS_UPGRADE_REQUIRED | 426 需要升级 |
XHTTP_STATUS_PRECONDITION_REQUIRED | 428 需要前提条件 |
XHTTP_STATUS_TOO_MANY_REQUESTS | 429 请求过多 |
XHTTP_STATUS_REQUEST_HEADER_FIELDS_TOO_LARGE | REQUESTHEADER字段TOOLARGE |
XHTTP_STATUS_UNAVAILABLE_FOR_LEGAL_REASONS | 451 因法律原因不可用 |
XHTTP_STATUS_INTERNAL_SERVER_ERROR | 内部错误服务端角色失败 |
XHTTP_STATUS_NOT_IMPLEMENTED | 501 未实现 |
XHTTP_STATUS_BAD_GATEWAY | 502 网关错误 |
XHTTP_STATUS_SERVICE_UNAVAILABLE | 503 服务不可用 |
XHTTP_STATUS_GATEWAY_TIMEOUT | GATEWAY超时 |
XHTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED | 505 版本不支持 |
XHTTP_STATUS_VARIANT_ALSO_NEGOTIATES | 506 变体协商错误 |
XHTTP_STATUS_INSUFFICIENT_STORAGE | 507 存储不足 |
XHTTP_STATUS_LOOP_DETECTED | 508 检测到循环 |
XHTTP_STATUS_NOT_EXTENDED | 510 未扩展 |
XHTTP_STATUS_NETWORK_AUTHENTICATION_REQUIRED | 511 需网络认证 |
xhttpfield类型
字段名称和值都是借用视图,不要求零结尾。
| 字段 | 类型 | 语义 |
|---|---|---|
Name | xstrview | 名称 |
Value | xstrview | 值 |
xhttpnext类型
HTTP 值迭代结果明确区分条目、正常结束和语法错误。
| 值 | 语义 |
|---|---|
XHTTP_NEXT_ERROR | 失败 |
XHTTP_NEXT_END | 遍历结束 |
XHTTP_NEXT_ITEM | 已产出一项 |
xhttpfieldtokencursor类型
重复同名 token-list 字段游标由初始化函数建立,调用方不得直接修改。
| 字段 | 类型 | 语义 |
|---|---|---|
Source | const void* | 源视图 |
Name | xstrview | 名称 |
Count | size_t | 数量 |
Field | size_t | Field |
Offset | size_t | 偏移量 |
Validated | uint8 | 是否已校验 |
Required | uint8 | 是否必需 |
xhttpweightedtoken类型
加权 token 借用原字段值,Quality 使用 0 到 1000 的无浮点定点值。
| 字段 | 类型 | 语义 |
|---|---|---|
Token | xstrview | Token |
Quality | uint16 | Quality |
xhttpauthority类型
HTTP authority 借用原始文本,不接受 userinfo。
| 字段 | 类型 | 语义 |
|---|---|---|
Flags | uint32 | 标志位 |
Port | uint16 | 端口 |
Text | xstrview | 文本视图 |
Host | xstrview | 主机名 |
PortText | xstrview | PortText |
xhttptargetform类型
Request-target 形式由方法与线路文本共同决定。
| 值 | 语义 |
|---|---|
XHTTP_TARGET_ORIGIN | origin-form(最常见) |
XHTTP_TARGET_ABSOLUTE | absolute-form(代理) |
XHTTP_TARGET_AUTHORITY | authority-form(CONNECT) |
XHTTP_TARGET_ASTERISK | asterisk-form(OPTIONS *) |
xhttptarget类型
Target 借用原始方法与 request-target,并只保留 HTTP 路径需要的 URI 组件。
| 字段 | 类型 | 语义 |
|---|---|---|
Form | xhttptargetform | Form |
Flags | uint32 | 标志位 |
Method | xstrview | 方法 |
Text | xstrview | 文本视图 |
Scheme | xstrview | 协议方案 |
Authority | xstrview | Authority |
Path | xstrview | 路径 |
Query | xstrview | 查询串 |
Host | xhttpauthority | 主机名 |
xhttpparamflags类型
参数值标志区分省略值、token 值和 quoted-string 值。
| 值 | 语义 |
|---|---|
XHTTP_PARAM_NONE | 无 |
XHTTP_PARAM_HAS_VALUE | HAS值非法 |
XHTTP_PARAM_QUOTED | 带引号 |
xhttpparam类型
参数名称和值借用原文本;quoted-string 值不含双引号,但保留反斜杠转义。
| 字段 | 类型 | 语义 |
|---|---|---|
Name | xstrview | 名称 |
Value | xstrview | 值 |
Flags | uint32 | 标志位 |
xhttpparamvaluecursor类型
参数语义值游标由初始化函数建立;Offset 是下一次读取的原始值偏移。
| 字段 | 类型 | 语义 |
|---|---|---|
Source | const void* | 源视图 |
Value | const void* | 值 |
ValueSize | size_t | ValueSize |
Offset | size_t | 偏移量 |
Flags | uint32 | 标志位 |
Validated | uint8 | 是否已校验 |
xrtHttpMethodParse函数
按大小写敏感规则分类 HTTP 方法;合法扩展方法返回 OTHER。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Method | 输入 | 借用 | 方法文本 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
XHTTP_METHOD_GET/POST/... | 已知方法 | — |
XHTTP_METHOD_OTHER | 合法扩展方法 | — |
XHTTP_METHOD_INVALID | 空值或非法 token | 不设置错误 |
- 无 — INVALID 是分类结果
xrtHttpMethodEqual函数
按 HTTP 大小写敏感规则比较两个合法方法名。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Left | 输入 | 借用 | 左方法名 |
Right | 输入 | 借用 | 右方法名 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 逐字节相等(HTTP 方法区分大小写) | — |
false | 不等 | 纯比较 |
- 无 — 纯比较
xrtHttpMethodSafe函数
判断方法是否只读取资源语义;GET、HEAD、OPTIONS 和 TRACE 属于安全方法。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Method | 输入 | 借用 | 方法文本 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 安全方法 | — |
false | 非安全 | 纯谓词 |
- 无 — 纯谓词
xrtHttpMethodIdempotent函数
判断方法是否允许重复执行而不改变预期效果;安全方法、PUT 和 DELETE 属于幂等方法。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Method | 输入 | 借用 | 方法文本 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 幂等 | — |
false | 非幂等 | 纯谓词 |
- 无 — 纯谓词
xrtHttpStatusText函数
返回已注册状态码的标准原因短语;未知、临时或未分配状态返回空视图。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
iStatus | 输入 | — | 状态码 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 静态原因短语(人类可读,协议逻辑不得依赖) | — |
| 空视图 | 未注册状态码 | 纯查询 |
- 无 — 查询结果即答案
xrtHttpResponseContentAllowed函数
判断最终响应是否允许携带内容;HEAD、1xx、204、205、304 和成功 CONNECT 返回假。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Method | 输入 | 借用、大小写敏感 | 请求方法 |
iStatus | 输入 | 100–999 | 状态码 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 允许携带内容 | — |
false | 禁止内容状态或无效方法/状态 | 纯谓词 |
- 无 — 纯谓词
范例已编译验证
printf(" content-allowed=%d\n",
xrtHttpResponseContentAllowed(SV("HEAD"), 204) ? 1 : 0);
xrtHttpTokenValid函数
判断文本是否是非空 HTTP token。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Text | 输入 | 借用 | 待判定文本 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 非空合法 token | — |
false | 空或含非法字符 | 纯谓词 |
- 无 — 纯谓词
xrtHttpTokenEqual函数
按 ASCII 大小写不敏感规则比较两个 token。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Left | 输入 | 借用 | 左 token |
Right | 输入 | 借用 | 右 token |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 大小写不敏感相等 | — |
false | 不等 | 纯比较 |
- 无 — 纯比较
xrtHttpOwsTrim函数
剥离两端的可选空白(SP/HTAB)并返回剩余视图。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Text | 输入 | 借用 | 输入文本 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 子视图 | 去除两端 OWS 的借用视图 | 纯切片 |
- 无 — 纯切片
xrtHttpTokenNext函数
按 RFC 接收方规则迭代 token-list,忽略逗号空元素;Offset 初始为零。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
List | 输入 | 借用 | token-list 文本 |
pOffset | 输入/输出 | 非空、初始零 | 游标 |
pToken | 输出 | 非空 | 接收条目(借用输入) |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
XHTTP_NEXT_ITEM | 取得一个 token,游标前进 | — |
XHTTP_NEXT_END | 迭代完成 | 不设错 |
XHTTP_NEXT_ERROR | 非空元素语法错误 | xrt.http 域错误 |
xrt.http域错误 — 非空元素非法 token
范例已编译验证
http/base · 字段值迭代 · 观察
while ( (Next = xrtHttpTokenNext(
Field.Value, &iOffset, &Token
)) == XHTTP_NEXT_ITEM ) {
xrtHttpTokenListHas函数
判断完整 token-list 是否包含指定 token;非空元素语法错误仍返回 false 并设置错误。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
List | 输入 | 借用 | token-list |
Token | 输入 | 借用 | 查找目标(大小写不敏感) |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 包含 | — |
false | 不包含,或列表非法 | 非法时设置 xrt.http 域错误 |
xrt.http域错误 — 非空元素非法
范例已编译验证
http/token_tour · 列表 · 观察
printf("has=%d", xrtHttpTokenListHas(SV(sList), SV("deflate")) ? 1
xrtHttpTokenListCount函数
统计 token-list 非空条目;空列表成功返回零。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
List | 输入 | 借用 | token-list |
pCount | 输出 | 非空 | 接收计数 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 计数已写出 | — |
false | 非空元素语法错误 | *pCount 不变 |
xrt.http域错误
xrtHttpTokenListWrite函数
规范写出逗号空格分隔的 token-list;空输出可精确查询长度。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pTokens | 输入 | 借用数组 | token 视图数组 |
iCount | 输入 | — | 条目数 |
pOutput | 输出 | 可空 | 空+零容量 = 只查长度 |
iCapacity | 输入 | — | 容量 |
pSize | 输出 | 可空 | 实际/所需长度 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已写出或长度已发布 | — |
false | 参数或容量错误 | 输出不变 |
XERR_ARGUMENT— 指针为空或视图非法XERR_RANGE— 容量不足(给出所需长度)
范例已编译验证
http/token_tour · 列表 · 观察
if ( xrtHttpTokenListWrite(Tokens, 2u, Buffer, sizeof(Buffer), &iSize) ) {
xrtHttpTokenListBuild函数
构建零结尾 token-list,返回值由 xrtFree 释放。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pTokens | 输入 | 借用数组 | token 数组 |
iCount | 输入 | — | 条目数 |
pSize | 输出 | 可空 | 接收长度 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 零结尾列表 | — |
NULL | 参数错误或 OOM | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 指针为空或视图非法XERR_MEMORY
xrtHttpQualityParse函数
严格解析 RFC qvalue(接受两端 OWS),结果范围 0–1000。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Text | 输入 | 借用 | qvalue 文本 |
pQuality | 输出 | 非空、不得与 Text 重叠 | 接收千分值 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已写出(0–1000) | — |
false | 语法错误或参数错误 | 输出保持为零/不变 |
XERR_ARGUMENT— 指针为空或视图非法xrt.http域错误 — 非法 qvalue
xrtHttpWeightedTokenNext函数
迭代 token [ weight ] 列表并忽略空成员;缺省 Quality 为 1000。可直接用于 Accept-Encoding 等字段。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
List | 输入 | 借用 | 加权列表文本 |
pOffset | 输入/输出 | 初始零 | 游标 |
pItem | 输出 | 非空 | 接收 Token+Quality |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
XHTTP_NEXT_ITEM | 取得一项 | — |
XHTTP_NEXT_END | 完成 | 不设错 |
XHTTP_NEXT_ERROR | 语法错误 | xrt.http 域错误 |
xrt.http域错误
范例已编译验证
while ( xrtHttpWeightedTokenNext(SV(sWeighted), &iOffset,
&Item) == XHTTP_NEXT_ITEM ) {
xrtHttpContentLengthParse函数
解析 Content-Length;逗号分隔的重复值只有完全一致时才成功。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Value | 输入 | 借用 | 字段值 |
pLength | 输出 | 非空 | 接收长度 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 长度已写出 | — |
false | 非法/重复不一致 | 输出保持为零 |
xrt.http域错误 — 非数字或重复值不一致
xrtHttpHostParse函数
解析单个 Host 字段值为借用 authority 结构;空字段值与空端口按 RFC 保留,PORT_VALUE 表示可用网络数值。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Value | 输入 | 借用、不含 OWS/字段名 | 字段值 |
pHost | 输出 | 非空、支持未对齐存储 | 接收借用视图 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 结构已发布(视图借用输入) | — |
false | 语法错误 | 输出不变 |
xrt.http域错误 — 非法 authority
范例已编译验证
http/host · 解析 · 观察
if ( !xrtHttpHostParse(
XRT_STR_LITERAL("[2001:db8::1]:8443"), &Host
) || !xrtHttpAuthorityPort(&Host, 80u, &iPort) ) {
xrtHttpHostValid函数
验证 Host 字段值是单个、无 userinfo 的 URI authority。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Value | 输入 | 借用 | 字段值 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 合法 | — |
false | 非法 | 纯谓词 |
- 无 — 纯谓词
xrtHttpIpv4Valid函数
严格验证 RFC 3986 IPv4 文本;拒绝多段、越界值和前导零。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Value | 输入 | 借用 | IPv4 文本 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 合法 | — |
false | 非法(含 01.2.3.4 前导零) | 纯谓词 |
- 无 — 纯谓词
xrtHttpIpv6Valid函数
严格验证 IPv6 文本,支持压缩和嵌入式 IPv4,不接受 ZoneID。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Value | 输入 | 借用 | IPv6 文本 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 合法 | — |
false | 非法 | 纯谓词 |
- 无 — 纯谓词
xrtHttpHostEqual函数
按 ASCII 大小写不敏感规则比较两个已拆分 Host 视图。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Left | 输入 | 借用 | 左 Host |
Right | 输入 | 借用 | 右 Host |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 相等(host 大小写不敏感) | — |
false | 不等 | 纯比较 |
- 无 — 纯比较
xrtHttpAuthorityValid函数
验证拆分后的 authority 字段、标志与端口数值保持一致。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pAuthority | 输入 | 非空 | 待验证结构 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 一致 | — |
false | 不一致 | 纯谓词 |
- 无 — 纯谓词
xrtHttpAuthorityPort函数
取得显式端口;省略或空端口使用调用方给出的默认值。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pAuthority | 输入 | 非空 | authority |
iDefaultPort | 输入 | — | 默认端口 |
pPort | 输出 | 非空 | 接收端口 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 端口已写出 | — |
false | 端口越界或参数错误 | 输出不变 |
xrt.http域错误 — 端口超出uint16
xrtHttpTargetParse函数
按方法严格解析 request-target;CONNECT 只接受带非空端口 authority,OPTIONS 星号须精确为 "*"。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Method | 输入 | 借用 | 方法文本 |
Text | 输入 | 借用 | target 文本 |
pTarget | 输出 | 支持未对齐存储、不得覆盖输入 | 接收解析结果 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已解析 | — |
false | 语法错误 | 输出不变 |
xrt.http域错误 — 非法 target
范例已编译验证
http/target · 解析 · 观察
if ( !xrtHttpTargetParse(
XRT_STR_LITERAL("GET"),
XRT_STR_LITERAL(
"https://example.test:8443/items?q=1"
xrtHttpTargetAuthority函数
解析请求的有效 authority:absolute/CONNECT 用 target,origin/星号用 Host 字段值。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pTarget | 输入 | 非空 | 已解析 target |
Host | 输入 | 借用 | Host 字段值 |
pAuthority | 输出 | 未对齐存储、不得覆盖输入 | 接收 authority |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已写出 | — |
false | 无可用 authority 或非法 | 输出不变 |
xrt.http域错误
范例已编译验证
) || !xrtHttpTargetAuthority(
&Target,
XRT_STR_LITERAL("ignored.test"),
xrtHttpFieldValueValid函数
判断合法连续文本是否能安全作为字段值或 reason-phrase;空视图允许为 NULL/0。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Value | 输入 | 借用 | 待判定文本 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 可安全作为字段值 | — |
false | 含 CR/LF/NUL 等非法字节 | 纯谓词 |
- 无 — 纯谓词
xrtHttpFieldParse函数
严格解析一行不含 CRLF 的 HTTP 字段;未对齐输出在返回前一次性发布。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Line | 输入 | 借用、不含 CRLF | 字段行 |
pField | 输出 | 非空、支持未对齐 | 接收 Name/Value 借用视图 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已解析 | — |
false | 语法错误 | 输出不变 |
xrt.http域错误 — 名称非法或缺少冒号
范例已编译验证
http/base · 字段解析 · 观察
if ( !xrtHttpFieldParse(
XRT_STR_LITERAL("Connection: keep-alive, Upgrade"), &Field
) ) {
xrtHttpFieldNext函数
严格读取不含终止空行的字段块;游标和字段输出支持未对齐存储。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Block | 输入 | 借用 | 字段块(CRLF 分隔,不含终止空行) |
pOffset | 输入/输出 | 初始零 | 游标 |
pField | 输出 | 非空、未对齐可用 | 接收条目 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
XHTTP_NEXT_ITEM | 取得一个字段 | — |
XHTTP_NEXT_END | 块耗尽 | 不设错 |
XHTTP_NEXT_ERROR | 语法错误 | 游标不变 |
xrt.http域错误
xrtHttpFieldBlockCount函数
严格统计完整字段块;空字段块成功返回零。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Block | 输入 | 借用 | 字段块 |
pCount | 输出 | 非空、未对齐可用 | 接收计数 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 计数已写出 | — |
false | 语法错误 | 计数不变 |
xrt.http域错误
范例已编译验证
if ( !xrtHttpFieldBlockCount(SV(sBlock), &iCount) || (iCount != 3u) ) {
xrtHttpFieldWrite函数
写出单个字段行及 CRLF;描述符和长度输出支持未对齐存储。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pField | 输入 | 非空 | 字段描述符 |
pOutput | 输出 | 可空 | 空+零容量 = 查长度 |
iCapacity | 输入 | — | 容量 |
pSize | 输出 | 可空 | 实际/所需长度 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已写出(含 CRLF) | — |
false | 容量不足或参数错误 | 输出不变 |
XERR_ARGUMENT— 指针为空或视图非法XERR_RANGE— 容量不足
范例已编译验证
http/field_tour · 写出 · 观察
(void)xrtHttpFieldWrite(&Fields[0], Buffer, sizeof(Buffer), &iSize);
xrtHttpFieldBlockWrite函数
写出字段数组及最终空行(块终止 CRLFCRLF)。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pFields | 输入 | 借用数组 | 字段描述符数组 |
iCount | 输入 | — | 条目数 |
pOutput | 输出 | 可空 | 空+零容量 = 查长度 |
iCapacity | 输入 | — | 容量 |
pSize | 输出 | 可空 | 长度 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已写出全部字段及终止空行 | — |
false | 容量不足或参数错误 | 输出不变 |
XERR_ARGUMENT— 指针为空或视图非法XERR_RANGE— 容量不足
范例已编译验证
http/base · 写出 · 观察
if ( (Next != XHTTP_NEXT_END) || !xrtHttpFieldBlockWrite(
&Field, 1, Output, sizeof(Output), &iSize
) ) {
xrtHttpFieldNameEqual函数
按 ASCII 大小写不敏感规则比较字段名称。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Left | 输入 | 借用 | 左名称 |
Right | 输入 | 借用 | 右名称 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 相等 | — |
false | 不等 | 纯比较 |
- 无 — 纯比较
xrtHttpFieldFind函数
从指定位置查找字段;未找到返回 XRT_NPOS。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pFields | 输入 | 借用数组、可未对齐 | 字段数组 |
iCount | 输入 | — | 条目数 |
Name | 输入 | 借用 | 查找名称 |
iStart | 输入 | — | 起始下标 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
>= 0 | 首个命中下标 | — |
XRT_NPOS | 未找到(正常结果) | 不设错 |
- 无 — 未找到是查询结果
xrtHttpFieldGet函数
返回原数组中第一个同名字段的借用地址,未找到返回空指针。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pFields | 输入 | 借用数组 | 字段数组 |
iCount | 输入 | — | 条目数 |
Name | 输入 | 借用 | 查找名称 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 借用字段地址 | — |
NULL | 未找到 | 不设错 |
- 无 — 未找到是查询结果
xrtHttpFieldGetUnique函数
返回唯一同名字段的借用地址;重复时区分命中/重复/未找到。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pFields | 输入 | 借用数组 | 字段数组 |
iCount | 输入 | — | 条目数 |
Name | 输入 | 借用 | 查找名称 |
ppField | 输出 | 非空、未对齐可用 | 接收唯一命中地址 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
XHTTP_NEXT_ITEM | 唯一命中 | — |
XHTTP_NEXT_END | 未找到 | 不设错 |
XHTTP_NEXT_ERROR | 同名重复(协议错误) | xrt.http 域错误 |
xrt.http域错误 — 同名字段出现多次
xrtHttpFieldCount函数
统计同名字段数量。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pFields | 输入 | 借用数组 | 字段数组 |
iCount | 输入 | — | 条目数 |
Name | 输入 | 借用 | 统计名称 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
>= 0 | 同名字段数(零 = 无) | — |
- 无 — 纯统计
xrtHttpFieldTokenCursorInit函数
初始化可重复使用的同名字段 token-list 游标。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCursor | 输出 | 非空 | 调用方存储 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 无 | 纯初始化 | — |
- 无 — 初始化不失败
xrtHttpFieldTokenNext函数
跨重复同名字段读取 token-list 条目,保持字段与条目线路顺序;首次发布前完整验证全部同名字段。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pFields | 输入 | 借用数组 | 字段数组 |
iCount | 输入 | — | 条目数 |
Name | 输入 | 借用 | 目标字段名 |
pCursor | 输入/输出 | 已初始化 | 游标 |
pToken | 输出 | 非空 | 接收条目 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
XHTTP_NEXT_ITEM | 已产出一项 | — |
XHTTP_NEXT_END | 遍历结束 | 不设错误 |
XHTTP_NEXT_ERROR | 解析失败 | xrt.http 域错误 |
xrt.http域错误 — 任一同名字段值非法
范例已编译验证
http/field_tour · token 游标 · 观察
while ( xrtHttpFieldTokenNext(Dup, 2u, SV("Accept-Encoding"),
xrtHttpFieldTokenCount函数
完整验证并统计全部重复同名字段中的非空 token 条目。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pFields | 输入 | 借用数组 | 字段数组 |
iCount | 输入 | — | 条目数 |
Name | 输入 | 借用 | 目标字段名 |
pTokenCount | 输出 | 非空 | 接收合计 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 合计已写出 | — |
false | 任一字段非法 | 计数不变 |
xrt.http域错误
xrtHttpFieldTokenFind函数
完整验证并在重复同名字段中查找 token;返回值区分找到/未找到/错误。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pFields | 输入 | 借用数组 | 字段数组 |
iCount | 输入 | — | 条目数 |
Name | 输入 | 借用 | 目标字段名 |
Token | 输入 | 借用 | 查找 token |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
XHTTP_NEXT_ITEM | 已产出一项 | — |
XHTTP_NEXT_END | 遍历结束 | — |
XHTTP_NEXT_ERROR | 失败 | — |
xrt.http域错误 — 字段值非法
xrtHttpQuotedValid函数
判断文本是否是一段完整、合法的 HTTP quoted-string。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Quoted | 输入 | 借用 | 含首尾引号的文本 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 合法 | — |
false | 非法 | 纯谓词 |
- 无 — 纯谓词
xrtHttpQuotedRead函数
解码完整 quoted-string;空输出查询长度且不附加零字符。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Quoted | 输入 | 借用 | quoted-string |
pOutput | 输出 | 可空 | 解码输出 |
iCapacity | 输入 | — | 容量 |
pSize | 输出 | 可空 | 解码长度 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已解码(删除转义) | — |
false | 非法或容量不足 | 输出不变 |
xrt.http域错误 — 非法 quoted-stringXERR_RANGE— 容量不足
范例已编译验证
if ( xrtHttpQuotedRead(SV("\"part;42\""), Buffer, sizeof(Buffer) - 1u,
xrtHttpQuotedWrite函数
写出带引号和必要转义的 quoted-string;不附加零字符。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Value | 输入 | 借用 | 未转义语义值 |
pOutput | 输出 | 可空 | 编码输出 |
iCapacity | 输入 | — | 容量 |
pSize | 输出 | 可空 | 编码长度 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已编码 | — |
false | 容量不足或参数错误 | 输出不变 |
XERR_ARGUMENT— 指针为空或视图非法XERR_RANGE— 容量不足
范例已编译验证
(void)xrtHttpQuotedWrite(SV("a\"b"), Buffer, sizeof(Buffer), &iSize);
xrtHttpQuotedBuild函数
构建零结尾 quoted-string;返回值由 xrtFree 释放。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Value | 输入 | 借用 | 语义值 |
pSize | 输出 | 可空 | 接收长度 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 零结尾编码结果 | — |
NULL | 参数错误或 OOM | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 指针为空或视图非法XERR_MEMORY
xrtHttpParamNext函数
严格读取分号参数;错误不推进游标并清空结果。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Parameters | 输入 | 借用 | 参数串 |
pOffset | 输入/输出 | 初始零 | 游标 |
pParam | 输出 | 非空、未对齐可用 | 接收 Name/Value/Flags |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
XHTTP_NEXT_ITEM | 已产出一项 | — |
XHTTP_NEXT_END | 遍历结束 | 不设错误 |
XHTTP_NEXT_ERROR | 解析失败 | xrt.http 域错误 |
xrt.http域错误
范例已编译验证
http/param · 迭代 · 观察
while ( (Next = xrtHttpParamNext(
Text, &iOffset, &Param
)) == XHTTP_NEXT_ITEM ) {
xrtHttpParamCount函数
严格统计完整参数列表;空列表或失败分别发布零。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Parameters | 输入 | 借用 | 参数串 |
pCount | 输出 | 非空、未对齐可用 | 接收计数 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 计数已写出 | — |
false | 语法错误 | 计数不变 |
xrt.http域错误
范例已编译验证
http/param_tour · 统计 · 观察
if ( !xrtHttpParamCount(SV(sParams), &iCount) || (iCount != 2u) ) {
xrtHttpParamFind函数
严格查找参数并验证全部后缀;未命中或错误时清空结果。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Parameters | 输入 | 借用 | 参数串 |
Name | 输入 | 借用 | 查找名称 |
pParam | 输出 | 非空 | 接收结果 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
XHTTP_NEXT_ITEM | 命中 | — |
XHTTP_NEXT_END | 未命中(不设错) | — |
XHTTP_NEXT_ERROR | 语法错误 | xrt.http 域错误 |
xrt.http域错误
xrtHttpParamTokenValid函数
判断参数是否带值且解码语义值为非空 token;不修改线程错误。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pParam | 输入 | 非空、可未对齐 | 参数描述符 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 值是非空 token | — |
false | 无值/非 token 语义 | 纯谓词 |
- 无 — 纯谓词(协议参数要求 token 语义时使用)
xrtHttpParamTokenEqual函数
按 ASCII 大小写不敏感规则比较参数的解码 token 值;纯谓词。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pParam | 输入 | 非空 | 参数描述符 |
Token | 输入 | 借用 | 比较目标 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 相等 | — |
false | 不等 | 纯谓词 |
- 无 — 纯谓词
xrtHttpParamValueCursorInit函数
初始化参数值逐字节游标。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCursor | 输出 | 非空 | 调用方存储 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 无 | 纯初始化 | — |
- 无 — 初始化不失败
xrtHttpParamValueNext函数
逐字节读取参数的解码语义值;首次调用完整验证并绑定参数;输入在迭代结束前必须不变。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pParam | 输入 | 非空 | 参数描述符 |
pCursor | 输入/输出 | 已初始化 | 游标 |
pByte | 输出 | 非空 | 接收一个解码字节 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
XHTTP_NEXT_ITEM | 已产出一项 | — |
XHTTP_NEXT_END | 遍历结束 | 不设错误 |
XHTTP_NEXT_ERROR | 解析失败 | xrt.http 域错误 |
xrt.http域错误 — 值非法
xrtHttpParamValueWrite函数
解码参数值;token 复制,quoted-string 删除转义。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pParam | 输入 | 非空、可未对齐 | 参数描述符 |
pOutput | 输出 | 可空 | 解码输出 |
iCapacity | 输入 | — | 容量 |
pSize | 输出 | 可空 | 解码长度 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已解码 | — |
false | 容量不足或值非法 | 输出不变 |
XERR_RANGE— 容量不足xrt.http域错误 — quoted-string 非法
范例已编译验证
http/param · 解码 · 观察
if ( !xrtHttpParamValueWrite(
&Param, Value, sizeof(Value), &iSize
) ) {
xrtHttpParamWrite函数
写出单个参数;QUOTED 转义正文,NONE 省略等号和值。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Name | 输入 | 借用 | 参数名 |
Value | 输入 | 借用 | 参数值 |
iFlags | 输入 | XHTTP_PARAM_* | HAS_VALUE/QUOTED/NONE |
pOutput | 输出 | 可空 | 输出缓冲 |
iCapacity | 输入 | — | 容量 |
pSize | 输出 | 可空 | 长度 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已写出 | — |
false | 容量不足或参数错误 | 输出不变 |
XERR_ARGUMENT— 指针为空或视图非法XERR_RANGE— 容量不足
范例已编译验证
http/param_tour · 写出 · 观察
if ( xrtHttpParamWrite(SV("charset"), SV("UTF-8"), XHTTP_PARAM_HAS_VALUE, Buffer,
xrtHttpParamBuild函数
构建零结尾参数文本;返回值由 xrtFree 释放。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Name | 输入 | 借用 | 参数名 |
Value | 输入 | 借用 | 参数值 |
iFlags | 输入 | — | 形态标志 |
pSize | 输出 | 可空 | 接收长度 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 零结尾结果 | — |
NULL | 参数错误或 OOM | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 指针为空或视图非法XERR_MEMORY
范例已编译验证
http/param_tour · 构建 · 观察
sBuilt = xrtHttpParamBuild(SV("charset"), SV("UTF-8"), XHTTP_PARAM_HAS_VALUE, NULL);
xrtHttpParamHostValid函数
判断参数解码值是否为合法 Host(用于 URI 解析层的 host 参数)。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pParam | 输入 | 非空 | 参数描述符 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 值是合法 Host | — |
false | 无值或非法 Host | 纯谓词 |
- 无 — 纯谓词
xrtHttpDirectiveNext函数
读取逗号分隔 name[=value] 指令的下一项;空列表项被忽略,值可为 token 或 quoted-string。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Directives | 输入 | 借用 | 指令列表 |
pOffset | 输入/输出 | 初始零 | 游标 |
pDirective | 输出 | 非空、未对齐可用 | 接收条目 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
XHTTP_NEXT_ITEM | 已产出一项 | — |
XHTTP_NEXT_END | 遍历结束 | 不设错误 |
XHTTP_NEXT_ERROR | 解析失败 | xrt.http 域错误 |
xrt.http域错误
xrtHttpDirectiveCount函数
严格统计完整指令列表;空项不计数,失败发布零。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Directives | 输入 | 借用 | 指令列表 |
pCount | 输出 | 非空 | 接收计数 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 计数已写出 | — |
false | 语法错误 | 计数不变 |
xrt.http域错误
xrtHttpDirectiveFind函数
查找首个指令并验证全部后缀;未命中或错误时清空。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Directives | 输入 | 借用 | 指令列表 |
Name | 输入 | 借用 | 查找名称 |
pDirective | 输出 | 非空 | 接收结果 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
XHTTP_NEXT_ITEM | 已产出一项 | — |
XHTTP_NEXT_END | 遍历结束 | — |
XHTTP_NEXT_ERROR | 失败 | — |
xrt.http域错误
常量索引常量
以下常量在本页所属头文件中定义,语义见公共头注释。
| 常量 | 说明 |
|---|---|
| XHTTP_AUTHORITY_HAS_PORT | 见头文件注释 |
| XHTTP_AUTHORITY_IP_LITERAL | 见头文件注释 |
| XHTTP_AUTHORITY_PORT_EMPTY | 见头文件注释 |
| XHTTP_AUTHORITY_PORT_VALUE | 见头文件注释 |
| XHTTP_METHOD_ANY | 见头文件注释 |
| XHTTP_METHOD_CONNECT | 见头文件注释 |
| XHTTP_METHOD_CRUD | 见头文件注释 |
| XHTTP_METHOD_DELETE | 见头文件注释 |
| XHTTP_METHOD_GET | 见头文件注释 |
| XHTTP_METHOD_HEAD | 见头文件注释 |
| XHTTP_METHOD_INVALID | 见头文件注释 |
| XHTTP_METHOD_OPTIONS | 见头文件注释 |
| XHTTP_METHOD_OTHER | 见头文件注释 |
| XHTTP_METHOD_PATCH | 见头文件注释 |
| XHTTP_METHOD_POST | 见头文件注释 |
| XHTTP_METHOD_PUT | 见头文件注释 |
| XHTTP_METHOD_TRACE | 见头文件注释 |
| XHTTP_NEXT_END | 见头文件注释 |
| XHTTP_NEXT_ERROR | 见头文件注释 |
| XHTTP_NEXT_ITEM | 见头文件注释 |
| XHTTP_PARAM_HAS_VALUE | 见头文件注释 |
| XHTTP_PARAM_NONE | 见头文件注释 |
| XHTTP_PARAM_QUOTED | 见头文件注释 |
| XHTTP_QUALITY_MAX | 见头文件注释 |
| XHTTP_STATUS_ACCEPTED | 见头文件注释 |
| XHTTP_STATUS_ALREADY_REPORTED | 见头文件注释 |
| XHTTP_STATUS_BAD_GATEWAY | 见头文件注释 |
| XHTTP_STATUS_BAD_REQUEST | 见头文件注释 |
| XHTTP_STATUS_CONFLICT | 见头文件注释 |
| XHTTP_STATUS_CONTENT_TOO_LARGE | 见头文件注释 |
| XHTTP_STATUS_CONTINUE | 见头文件注释 |
| XHTTP_STATUS_CREATED | 见头文件注释 |
| XHTTP_STATUS_EARLY_HINTS | 见头文件注释 |
| XHTTP_STATUS_EXPECTATION_FAILED | 见头文件注释 |
| XHTTP_STATUS_FAILED_DEPENDENCY | 见头文件注释 |
| XHTTP_STATUS_FORBIDDEN | 见头文件注释 |
| XHTTP_STATUS_FOUND | 见头文件注释 |
| XHTTP_STATUS_GATEWAY_TIMEOUT | 见头文件注释 |
| XHTTP_STATUS_GONE | 见头文件注释 |
| XHTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED | 见头文件注释 |
| XHTTP_STATUS_IM_USED | 见头文件注释 |
| XHTTP_STATUS_INSUFFICIENT_STORAGE | 见头文件注释 |
| XHTTP_STATUS_INTERNAL_SERVER_ERROR | 见头文件注释 |
| XHTTP_STATUS_LENGTH_REQUIRED | 见头文件注释 |
| XHTTP_STATUS_LOCKED | 见头文件注释 |
| XHTTP_STATUS_LOOP_DETECTED | 见头文件注释 |
| XHTTP_STATUS_METHOD_NOT_ALLOWED | 见头文件注释 |
| XHTTP_STATUS_MISDIRECTED_REQUEST | 见头文件注释 |
| XHTTP_STATUS_MOVED_PERMANENTLY | 见头文件注释 |
| XHTTP_STATUS_MULTIPLE_CHOICES | 见头文件注释 |
| XHTTP_STATUS_MULTI_STATUS | 见头文件注释 |
| XHTTP_STATUS_NETWORK_AUTHENTICATION_REQUIRED | 见头文件注释 |
| XHTTP_STATUS_NON_AUTHORITATIVE_INFORMATION | 见头文件注释 |
| XHTTP_STATUS_NOT_ACCEPTABLE | 见头文件注释 |
| XHTTP_STATUS_NOT_EXTENDED | 见头文件注释 |
| XHTTP_STATUS_NOT_FOUND | 见头文件注释 |
| XHTTP_STATUS_NOT_IMPLEMENTED | 见头文件注释 |
| XHTTP_STATUS_NOT_MODIFIED | 见头文件注释 |
| XHTTP_STATUS_NO_CONTENT | 见头文件注释 |
| XHTTP_STATUS_OK | 见头文件注释 |
| XHTTP_STATUS_PARTIAL_CONTENT | 见头文件注释 |
| XHTTP_STATUS_PAYMENT_REQUIRED | 见头文件注释 |
| XHTTP_STATUS_PERMANENT_REDIRECT | 见头文件注释 |
| XHTTP_STATUS_PRECONDITION_FAILED | 见头文件注释 |
| XHTTP_STATUS_PRECONDITION_REQUIRED | 见头文件注释 |
| XHTTP_STATUS_PROCESSING | 见头文件注释 |
| XHTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED | 见头文件注释 |
| XHTTP_STATUS_RANGE_NOT_SATISFIABLE | 见头文件注释 |
| XHTTP_STATUS_REQUEST_HEADER_FIELDS_TOO_LARGE | 见头文件注释 |
| XHTTP_STATUS_REQUEST_TIMEOUT | 见头文件注释 |
| XHTTP_STATUS_RESET_CONTENT | 见头文件注释 |
| XHTTP_STATUS_SEE_OTHER | 见头文件注释 |
| XHTTP_STATUS_SERVICE_UNAVAILABLE | 见头文件注释 |
| XHTTP_STATUS_SWITCHING_PROTOCOLS | 见头文件注释 |
| XHTTP_STATUS_TEMPORARY_REDIRECT | 见头文件注释 |
| XHTTP_STATUS_TOO_EARLY | 见头文件注释 |
| XHTTP_STATUS_TOO_MANY_REQUESTS | 见头文件注释 |
| XHTTP_STATUS_UNAUTHORIZED | 见头文件注释 |
| XHTTP_STATUS_UNAVAILABLE_FOR_LEGAL_REASONS | 见头文件注释 |
| XHTTP_STATUS_UNPROCESSABLE_CONTENT | 见头文件注释 |
| XHTTP_STATUS_UNSUPPORTED_MEDIA_TYPE | 见头文件注释 |
| XHTTP_STATUS_UPGRADE_REQUIRED | 见头文件注释 |
| XHTTP_STATUS_URI_TOO_LONG | 见头文件注释 |
| XHTTP_STATUS_USE_PROXY | 见头文件注释 |
| XHTTP_STATUS_VARIANT_ALSO_NEGOTIATES | 见头文件注释 |
| XHTTP_TARGET_ABSOLUTE | 见头文件注释 |
| XHTTP_TARGET_ASTERISK | 见头文件注释 |
| XHTTP_TARGET_AUTHORITY | 见头文件注释 |
| XHTTP_TARGET_HAS_AUTHORITY | 见头文件注释 |
| XHTTP_TARGET_HAS_QUERY | 见头文件注释 |
| XHTTP_TARGET_HAS_SCHEME | 见头文件注释 |
| XHTTP_TARGET_ORIGIN | 见头文件注释 |
| XHTTP_VERSION_1_0 | 见头文件注释 |
| XHTTP_VERSION_1_1 | 见头文件注释 |