模块契约HTTP 协议底座

线程

解析、编码与字段表 API 为无共享状态的纯函数或单拥有者对象,可任意线程并发调用(不同对象间);同一对象(连接、字段表)由使用它的执行流独占。

模块边界

模块裁剪宏作用
httpXRT_MODULE_HTTPtoken、字段、方法、状态和 Content-Length
http_paramXRT_MODULE_HTTP_PARAM参数与 quoted-string 语法
http_param_hostXRT_MODULE_HTTP_PARAM_HOST参数解码后的无分配 Host 验证
http_expectXRT_MODULE_HTTP_EXPECTExpect 字段
http_upgradeXRT_MODULE_HTTP_UPGRADEUpgrade 字段与写出
http_teXRT_MODULE_HTTP_TETE 与 transfer-coding 参数
http_connectionXRT_MODULE_HTTP_CONNECTIONConnection 选项与持久连接
http_trailerXRT_MODULE_HTTP_TRAILERTrailer 声明和尾字段约束
http_encodingXRT_MODULE_HTTP_ENCODINGAccept-Encoding 与 Content-Encoding
http_decodeXRT_MODULE_HTTP_DECODE流式 gzip/deflate 自动解码
http_hostXRT_MODULE_HTTP_HOSTHost authority
http_targetXRT_MODULE_HTTP_TARGET四种 request-target
http1_headXRT_MODULE_HTTP1_HEAD起始行、Header 解析与写入
http1_netXRT_MODULE_HTTP1_NETTCP 块链 Header 解析与余量保留
http1_tlsXRT_MODULE_HTTP1_TLSTLS 明文块链增量 Header 解析
http1_bodyXRT_MODULE_HTTP1_BODY正文计划、chunked 和 trailer
http1_messageXRT_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_GETGET 方法
XHTTP_METHOD_HEADHEAD 方法
XHTTP_METHOD_POSTPOST 方法
XHTTP_METHOD_PUTPUT 方法
XHTTP_METHOD_DELETEDELETE 方法
XHTTP_METHOD_CONNECTCONNECT 方法
XHTTP_METHOD_OPTIONSOPTIONS 方法
XHTTP_METHOD_TRACE最详细级别
XHTTP_METHOD_PATCHPATCH 方法
typedef enum xhttpmethod { XHTTP_METHOD_INVALID = 0, XHTTP_METHOD_OTHER = UINT32_C(0x00000001), XHTTP_METHOD_GET = UINT32_C(0x00000002), XHTTP_METHOD_HEAD = UINT32_C(0x00000004), XHTTP_METHOD_POST = UINT32_C(0x00000008), XHTTP_METHOD_PUT = UINT32_C(0x00000010), XHTTP_METHOD_DELETE = UINT32_C(0x00000020), XHTTP_METHOD_CONNECT = UINT32_C(0x00000040), XHTTP_METHOD_OPTIONS = UINT32_C(0x00000080), XHTTP_METHOD_TRACE = UINT32_C(0x00000100), XHTTP_METHOD_PATCH = UINT32_C(0x00000200)

xhttpversion类型

HTTP 版本使用可直接比较的主次版本编码。

值语义
XHTTP_VERSION_1_0HTTP/1.0
XHTTP_VERSION_1_1HTTP/1.1
typedef enum xhttpversion { XHTTP_VERSION_1_0 = 10, XHTTP_VERSION_1_1 = 11 } xhttpversion;

xhttpstatus类型

HTTP 状态常量只收录 IANA 已正式分配的通用状态。 未分配、临时分配和明确标记为 Unused 的数值仍可直接使用 uint16 表达。

值语义
XHTTP_STATUS_CONTINUECONTINUE(100 继续)
XHTTP_STATUS_SWITCHING_PROTOCOLS101 协议切换
XHTTP_STATUS_PROCESSING102 处理中
XHTTP_STATUS_EARLY_HINTS103 早期提示
XHTTP_STATUS_OK成功
XHTTP_STATUS_CREATED201 已创建
XHTTP_STATUS_ACCEPTED202 已接受
XHTTP_STATUS_NON_AUTHORITATIVE_INFORMATION203 非权威信息
XHTTP_STATUS_NO_CONTENT204 无内容
XHTTP_STATUS_RESET_CONTENT205 重置内容
XHTTP_STATUS_PARTIAL_CONTENT206 部分内容
XHTTP_STATUS_MULTI_STATUS207 多状态
XHTTP_STATUS_ALREADY_REPORTED208 已报告
XHTTP_STATUS_IM_USED226 IM 已使用
XHTTP_STATUS_MULTIPLE_CHOICES300 多选项
XHTTP_STATUS_MOVED_PERMANENTLY301 永久移动
XHTTP_STATUS_FOUND302 找到(临时移动)
XHTTP_STATUS_SEE_OTHER303 见其他
XHTTP_STATUS_NOT_MODIFIED304 未修改
XHTTP_STATUS_USE_PROXY305 使用代理
XHTTP_STATUS_TEMPORARY_REDIRECT307 临时重定向
XHTTP_STATUS_PERMANENT_REDIRECT308 永久重定向
XHTTP_STATUS_BAD_REQUEST400 错误请求
XHTTP_STATUS_UNAUTHORIZED401 未认证
XHTTP_STATUS_PAYMENT_REQUIRED402 需要付费
XHTTP_STATUS_FORBIDDEN403 禁止
XHTTP_STATUS_NOT_FOUND未找到
XHTTP_STATUS_METHOD_NOT_ALLOWED405 方法不允许
XHTTP_STATUS_NOT_ACCEPTABLE406 不可接受
XHTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED407 需代理认证
XHTTP_STATUS_REQUEST_TIMEOUTREQUEST超时
XHTTP_STATUS_CONFLICT冲突
XHTTP_STATUS_GONE410 已消失
XHTTP_STATUS_LENGTH_REQUIRED411 需要 Content-Length
XHTTP_STATUS_PRECONDITION_FAILEDPRECONDITION已失败
XHTTP_STATUS_CONTENT_TOO_LARGE413 内容过大
XHTTP_STATUS_URI_TOO_LONG414 URI 过长
XHTTP_STATUS_UNSUPPORTED_MEDIA_TYPE不支持MEDIA类型
XHTTP_STATUS_RANGE_NOT_SATISFIABLE范围越界NOTSATISFIABLE
XHTTP_STATUS_EXPECTATION_FAILEDEXPECTATION已失败
XHTTP_STATUS_MISDIRECTED_REQUEST421 请求被误送
XHTTP_STATUS_UNPROCESSABLE_CONTENT422 无法处理
XHTTP_STATUS_LOCKED423 已锁定
XHTTP_STATUS_FAILED_DEPENDENCY已失败DEPENDENCY
XHTTP_STATUS_TOO_EARLY425 过早
XHTTP_STATUS_UPGRADE_REQUIRED426 需要升级
XHTTP_STATUS_PRECONDITION_REQUIRED428 需要前提条件
XHTTP_STATUS_TOO_MANY_REQUESTS429 请求过多
XHTTP_STATUS_REQUEST_HEADER_FIELDS_TOO_LARGEREQUESTHEADER字段TOOLARGE
XHTTP_STATUS_UNAVAILABLE_FOR_LEGAL_REASONS451 因法律原因不可用
XHTTP_STATUS_INTERNAL_SERVER_ERROR内部错误服务端角色失败
XHTTP_STATUS_NOT_IMPLEMENTED501 未实现
XHTTP_STATUS_BAD_GATEWAY502 网关错误
XHTTP_STATUS_SERVICE_UNAVAILABLE503 服务不可用
XHTTP_STATUS_GATEWAY_TIMEOUTGATEWAY超时
XHTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED505 版本不支持
XHTTP_STATUS_VARIANT_ALSO_NEGOTIATES506 变体协商错误
XHTTP_STATUS_INSUFFICIENT_STORAGE507 存储不足
XHTTP_STATUS_LOOP_DETECTED508 检测到循环
XHTTP_STATUS_NOT_EXTENDED510 未扩展
XHTTP_STATUS_NETWORK_AUTHENTICATION_REQUIRED511 需网络认证
typedef enum xhttpstatus { /* 1xx:信息响应。 */ XHTTP_STATUS_CONTINUE = 100, XHTTP_STATUS_SWITCHING_PROTOCOLS = 101, XHTTP_STATUS_PROCESSING = 102, XHTTP_STATUS_EARLY_HINTS = 103, /* 2xx:成功响应。 */ XHTTP_STATUS_OK = 200, 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, /* 3xx:重定向响应。 */ 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, /* 4xx:客户端错误响应。 */ XHTTP_STATUS_BAD_REQUEST = 400, XHTTP_STATUS_UNAUTHORIZED = 401, XHTTP_STATUS_PAYMENT_REQUIRED = 402, XHTTP_STATUS_FORBIDDEN = 403, XHTTP_STATUS_NOT_FOUND = 404, XHTTP_STATUS_METHOD_NOT_ALLOWED = 405, XHTTP_STATUS_NOT_ACCEPTABLE = 406, XHTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED = 407, XHTTP_STATUS_REQUEST_TIMEOUT = 408, XHTTP_STATUS_CONFLICT = 409, XHTTP_STATUS_GONE = 410, XHTTP_STATUS_LENGTH_REQUIRED = 411, XHTTP_STATUS_PRECONDITION_FAILED = 412, XHTTP_STATUS_CONTENT_TOO_LARGE = 413, XHTTP_STATUS_URI_TOO_LONG = 414, XHTTP_STATUS_UNSUPPORTED_MEDIA_TYPE = 415, XHTTP_STATUS_RANGE_NOT_SATISFIABLE = 416, XHTTP_STATUS_EXPECTATION_FAILED = 417, XHTTP_STATUS_MISDIRECTED_REQUEST = 421, XHTTP_STATUS_UNPROCESSABLE_CONTENT = 422, XHTTP_STATUS_LOCKED = 423, XHTTP_STATUS_FAILED_DEPENDENCY = 424, 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 = 431, XHTTP_STATUS_UNAVAILABLE_FOR_LEGAL_REASONS = 451, /* 5xx:服务器错误响应。 */ XHTTP_STATUS_INTERNAL_SERVER_ERROR = 500, XHTTP_STATUS_NOT_IMPLEMENTED = 501, XHTTP_STATUS_BAD_GATEWAY = 502, XHTTP_STATUS_SERVICE_UNAVAILABLE = 503, XHTTP_STATUS_GATEWAY_TIMEOUT = 504, 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 } xhttpstatus;

xhttpfield类型

字段名称和值都是借用视图,不要求零结尾。

字段类型语义
Namexstrview名称
Valuexstrview值
typedef struct xhttpfield { xstrview Name; xstrview Value; } xhttpfield;

xhttpnext类型

HTTP 值迭代结果明确区分条目、正常结束和语法错误。

值语义
XHTTP_NEXT_ERROR失败
XHTTP_NEXT_END遍历结束
XHTTP_NEXT_ITEM已产出一项
typedef enum xhttpnext { XHTTP_NEXT_ERROR = -1, XHTTP_NEXT_END = 0, XHTTP_NEXT_ITEM = 1 } xhttpnext;

xhttpfieldtokencursor类型

重复同名 token-list 字段游标由初始化函数建立,调用方不得直接修改。

字段类型语义
Sourceconst void*源视图
Namexstrview名称
Countsize_t数量
Fieldsize_tField
Offsetsize_t偏移量
Validateduint8是否已校验
Requireduint8是否必需
typedef struct xhttpfieldtokencursor { const void* Source; xstrview Name; size_t Count; size_t Field; size_t Offset; uint8 Validated; uint8 Required; } xhttpfieldtokencursor;

xhttpweightedtoken类型

加权 token 借用原字段值,Quality 使用 0 到 1000 的无浮点定点值。

字段类型语义
TokenxstrviewToken
Qualityuint16Quality
typedef struct xhttpweightedtoken { xstrview Token; uint16 Quality; } xhttpweightedtoken;

xhttpauthority类型

HTTP authority 借用原始文本,不接受 userinfo。

字段类型语义
Flagsuint32标志位
Portuint16端口
Textxstrview文本视图
Hostxstrview主机名
PortTextxstrviewPortText
typedef struct xhttpauthority { uint32 Flags; uint16 Port; xstrview Text; xstrview Host; xstrview PortText; } xhttpauthority;

xhttptargetform类型

Request-target 形式由方法与线路文本共同决定。

值语义
XHTTP_TARGET_ORIGINorigin-form(最常见)
XHTTP_TARGET_ABSOLUTEabsolute-form(代理)
XHTTP_TARGET_AUTHORITYauthority-form(CONNECT)
XHTTP_TARGET_ASTERISKasterisk-form(OPTIONS *)
typedef enum xhttptargetform { XHTTP_TARGET_ORIGIN = 1, XHTTP_TARGET_ABSOLUTE, XHTTP_TARGET_AUTHORITY, XHTTP_TARGET_ASTERISK } xhttptargetform;

xhttptarget类型

Target 借用原始方法与 request-target,并只保留 HTTP 路径需要的 URI 组件。

字段类型语义
FormxhttptargetformForm
Flagsuint32标志位
Methodxstrview方法
Textxstrview文本视图
Schemexstrview协议方案
AuthorityxstrviewAuthority
Pathxstrview路径
Queryxstrview查询串
Hostxhttpauthority主机名
typedef struct xhttptarget { xhttptargetform Form; uint32 Flags; xstrview Method; xstrview Text; xstrview Scheme; xstrview Authority; xstrview Path; xstrview Query; xhttpauthority Host; } xhttptarget;

xhttpparamflags类型

参数值标志区分省略值、token 值和 quoted-string 值。

值语义
XHTTP_PARAM_NONE无
XHTTP_PARAM_HAS_VALUEHAS值非法
XHTTP_PARAM_QUOTED带引号
typedef enum xhttpparamflags { XHTTP_PARAM_NONE = 0, XHTTP_PARAM_HAS_VALUE = 0x01, XHTTP_PARAM_QUOTED = 0x02 } xhttpparamflags;

xhttpparam类型

参数名称和值借用原文本;quoted-string 值不含双引号,但保留反斜杠转义。

字段类型语义
Namexstrview名称
Valuexstrview值
Flagsuint32标志位
typedef struct xhttpparam { xstrview Name; xstrview Value; uint32 Flags; } xhttpparam;

xhttpparamvaluecursor类型

参数语义值游标由初始化函数建立;Offset 是下一次读取的原始值偏移。

字段类型语义
Sourceconst void*源视图
Valueconst void*值
ValueSizesize_tValueSize
Offsetsize_t偏移量
Flagsuint32标志位
Validateduint8是否已校验
typedef struct xhttpparamvaluecursor { const void* Source; const void* Value; size_t ValueSize; size_t Offset; uint32 Flags; uint8 Validated; } xhttpparamvaluecursor;
方法与状态

xrtHttpMethodParse函数

按大小写敏感规则分类 HTTP 方法;合法扩展方法返回 OTHER。

xhttpmethod xrtHttpMethodParse(xstrview Method)

参数

参数方向约束说明
Method输入借用方法文本
返回值
返回含义失败时状态
XHTTP_METHOD_GET/POST/...已知方法—
XHTTP_METHOD_OTHER合法扩展方法—
XHTTP_METHOD_INVALID空值或非法 token不设置错误
错误
  • 无 — INVALID 是分类结果

范例已编译验证

http/method_tour · 方法 · 观察

		printf("parse=%u", (unsigned)xrtHttpMethodParse(SV("GET")));

xrtHttpMethodEqual函数

按 HTTP 大小写敏感规则比较两个合法方法名。

bool xrtHttpMethodEqual(xstrview Left, xstrview Right)

参数

参数方向约束说明
Left输入借用左方法名
Right输入借用右方法名
返回值
返回含义失败时状态
true逐字节相等(HTTP 方法区分大小写)—
false不等纯比较
错误
  • 无 — 纯比较

范例已编译验证

http/method_tour · 方法 · 观察

		xrtHttpMethodEqual(SV("PATCH"), SV("PATCH")) ? 1

xrtHttpMethodSafe函数

判断方法是否只读取资源语义;GET、HEAD、OPTIONS 和 TRACE 属于安全方法。

bool xrtHttpMethodSafe(xstrview Method)

参数

参数方向约束说明
Method输入借用方法文本
返回值
返回含义失败时状态
true安全方法—
false非安全纯谓词
错误
  • 无 — 纯谓词

范例已编译验证

http/method_tour · 方法 · 观察

		printf(" safe=%d", xrtHttpMethodSafe(SV("GET")) ? 1

xrtHttpMethodIdempotent函数

判断方法是否允许重复执行而不改变预期效果;安全方法、PUT 和 DELETE 属于幂等方法。

bool xrtHttpMethodIdempotent(xstrview Method)

参数

参数方向约束说明
Method输入借用方法文本
返回值
返回含义失败时状态
true幂等—
false非幂等纯谓词
错误
  • 无 — 纯谓词

范例已编译验证

http/method_tour · 方法 · 观察

		printf(" idem=%d\n", xrtHttpMethodIdempotent(SV("DELETE")) ? 1

xrtHttpStatusText函数

返回已注册状态码的标准原因短语;未知、临时或未分配状态返回空视图。

xstrview xrtHttpStatusText(uint16 iStatus)

参数

参数方向约束说明
iStatus输入—状态码
返回值
返回含义失败时状态
非空静态原因短语(人类可读,协议逻辑不得依赖)—
空视图未注册状态码纯查询
错误
  • 无 — 查询结果即答案

范例已编译验证

http/method_tour · 状态 · 观察

		xstrview Text = xrtHttpStatusText(200);

xrtHttpResponseContentAllowed函数

判断最终响应是否允许携带内容;HEAD、1xx、204、205、304 和成功 CONNECT 返回假。

bool xrtHttpResponseContentAllowed(xstrview Method, uint16 iStatus)

参数

参数方向约束说明
Method输入借用、大小写敏感请求方法
iStatus输入100–999状态码
返回值
返回含义失败时状态
true允许携带内容—
false禁止内容状态或无效方法/状态纯谓词
错误
  • 无 — 纯谓词

范例已编译验证

http/method_tour · 状态 · 观察

		printf(" content-allowed=%d\n",
			xrtHttpResponseContentAllowed(SV("HEAD"), 204) ? 1 : 0);
令牌与 OWS

xrtHttpTokenValid函数

判断文本是否是非空 HTTP token。

bool xrtHttpTokenValid(xstrview Text)

参数

参数方向约束说明
Text输入借用待判定文本
返回值
返回含义失败时状态
true非空合法 token—
false空或含非法字符纯谓词
错误
  • 无 — 纯谓词

范例已编译验证

http/token_tour · 令牌 · 观察

		printf("valid=%d", xrtHttpTokenValid(SV("gzip")) ? 1

xrtHttpTokenEqual函数

按 ASCII 大小写不敏感规则比较两个 token。

bool xrtHttpTokenEqual(xstrview Left, xstrview Right)

参数

参数方向约束说明
Left输入借用左 token
Right输入借用右 token
返回值
返回含义失败时状态
true大小写不敏感相等—
false不等纯比较
错误
  • 无 — 纯比较

范例已编译验证

http/token_tour · 令牌 · 观察

		printf(" eq=%d\n", xrtHttpTokenEqual(SV("GZIP"), SV("gzip")) ? 1

xrtHttpOwsTrim函数

剥离两端的可选空白(SP/HTAB)并返回剩余视图。

xstrview xrtHttpOwsTrim(xstrview Text)

参数

参数方向约束说明
Text输入借用输入文本
返回值
返回含义失败时状态
子视图去除两端 OWS 的借用视图纯切片
错误
  • 无 — 纯切片

范例已编译验证

http/token_tour · OWS · 观察

	Trimmed = xrtHttpOwsTrim(SV("  value  "));

xrtHttpTokenNext函数

按 RFC 接收方规则迭代 token-list,忽略逗号空元素;Offset 初始为零。

xhttpnext xrtHttpTokenNext(xstrview List, size_t* pOffset, xstrview* pToken)

参数

参数方向约束说明
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 并设置错误。

bool xrtHttpTokenListHas(xstrview List, xstrview Token)

参数

参数方向约束说明
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 非空条目;空列表成功返回零。

bool xrtHttpTokenListCount(xstrview List, size_t* pCount)

参数

参数方向约束说明
List输入借用token-list
pCount输出非空接收计数
返回值
返回含义失败时状态
true计数已写出—
false非空元素语法错误*pCount 不变
错误
  • xrt.http 域错误

范例已编译验证

http/token_tour · 列表 · 观察

		if ( xrtHttpTokenListCount(SV(sList), &iCount) ) {

xrtHttpTokenListWrite函数

规范写出逗号空格分隔的 token-list;空输出可精确查询长度。

bool xrtHttpTokenListWrite(const xstrview* pTokens, size_t iCount, void* pOutput, size_t iCapacity, size_t* pSize)

参数

参数方向约束说明
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 释放。

str xrtHttpTokenListBuild(const xstrview* pTokens, size_t iCount, size_t* pSize)

参数

参数方向约束说明
pTokens输入借用数组token 数组
iCount输入—条目数
pSize输出可空接收长度
返回值
返回含义失败时状态
非空零结尾列表—
NULL参数错误或 OOM错误经 xrtGetError() 报告
错误
  • XERR_ARGUMENT — 指针为空或视图非法
  • XERR_MEMORY

范例已编译验证

http/token_tour · 列表 · 观察

		sBuilt = xrtHttpTokenListBuild(Tokens, 3u, NULL);
权重与长度

xrtHttpQualityParse函数

严格解析 RFC qvalue(接受两端 OWS),结果范围 0–1000。

bool xrtHttpQualityParse(xstrview Text, uint16* pQuality)

参数

参数方向约束说明
Text输入借用qvalue 文本
pQuality输出非空、不得与 Text 重叠接收千分值
返回值
返回含义失败时状态
true已写出(0–1000)—
false语法错误或参数错误输出保持为零/不变
错误
  • XERR_ARGUMENT — 指针为空或视图非法
  • xrt.http 域错误 — 非法 qvalue

范例已编译验证

http/method_tour · 权重 · 观察

		if ( !xrtHttpQualityParse(SV("0.5"), &iQuality) ) {

xrtHttpWeightedTokenNext函数

迭代 token [ weight ] 列表并忽略空成员;缺省 Quality 为 1000。可直接用于 Accept-Encoding 等字段。

xhttpnext xrtHttpWeightedTokenNext(xstrview List, size_t* pOffset, xhttpweightedtoken* pItem)

参数

参数方向约束说明
List输入借用加权列表文本
pOffset输入/输出初始零游标
pItem输出非空接收 Token+Quality
返回值
返回含义失败时状态
XHTTP_NEXT_ITEM取得一项—
XHTTP_NEXT_END完成不设错
XHTTP_NEXT_ERROR语法错误xrt.http 域错误
错误
  • xrt.http 域错误

范例已编译验证

http/token_tour · 加权迭代 · 观察

		while ( xrtHttpWeightedTokenNext(SV(sWeighted), &iOffset,
			&Item) == XHTTP_NEXT_ITEM ) {

xrtHttpContentLengthParse函数

解析 Content-Length;逗号分隔的重复值只有完全一致时才成功。

bool xrtHttpContentLengthParse(xstrview Value, uint64* pLength)

参数

参数方向约束说明
Value输入借用字段值
pLength输出非空接收长度
返回值
返回含义失败时状态
true长度已写出—
false非法/重复不一致输出保持为零
错误
  • xrt.http 域错误 — 非数字或重复值不一致

范例已编译验证

http/method_tour · 长度 · 观察

		if ( !xrtHttpContentLengthParse(SV("42"), &iLength) ) {
Host 与 Authority

xrtHttpHostParse函数

解析单个 Host 字段值为借用 authority 结构;空字段值与空端口按 RFC 保留,PORT_VALUE 表示可用网络数值。

bool xrtHttpHostParse(xstrview Value, xhttpauthority* pHost)

参数

参数方向约束说明
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。

bool xrtHttpHostValid(xstrview Value)

参数

参数方向约束说明
Value输入借用字段值
返回值
返回含义失败时状态
true合法—
false非法纯谓词
错误
  • 无 — 纯谓词

范例已编译验证

http/validate_tour · Host · 观察

		xrtHttpHostValid(SV("example.com")) ? 1

xrtHttpIpv4Valid函数

严格验证 RFC 3986 IPv4 文本;拒绝多段、越界值和前导零。

bool xrtHttpIpv4Valid(xstrview Value)

参数

参数方向约束说明
Value输入借用IPv4 文本
返回值
返回含义失败时状态
true合法—
false非法(含 01.2.3.4 前导零)纯谓词
错误
  • 无 — 纯谓词

范例已编译验证

http/validate_tour · IPv4 · 观察

		xrtHttpIpv4Valid(SV("01.2.3.4")) ? 1

xrtHttpIpv6Valid函数

严格验证 IPv6 文本,支持压缩和嵌入式 IPv4,不接受 ZoneID。

bool xrtHttpIpv6Valid(xstrview Value)

参数

参数方向约束说明
Value输入借用IPv6 文本
返回值
返回含义失败时状态
true合法—
false非法纯谓词
错误
  • 无 — 纯谓词

范例已编译验证

http/validate_tour · IPv6 · 观察

		xrtHttpIpv6Valid(SV("

xrtHttpHostEqual函数

按 ASCII 大小写不敏感规则比较两个已拆分 Host 视图。

bool xrtHttpHostEqual(xstrview Left, xstrview Right)

参数

参数方向约束说明
Left输入借用左 Host
Right输入借用右 Host
返回值
返回含义失败时状态
true相等(host 大小写不敏感)—
false不等纯比较
错误
  • 无 — 纯比较

范例已编译验证

http/validate_tour · Host · 观察

		xrtHttpHostEqual(SV("EXAMPLE.com"), SV("example.com")) ? 1

xrtHttpAuthorityValid函数

验证拆分后的 authority 字段、标志与端口数值保持一致。

bool xrtHttpAuthorityValid(const xhttpauthority* pAuthority)

参数

参数方向约束说明
pAuthority输入非空待验证结构
返回值
返回含义失败时状态
true一致—
false不一致纯谓词
错误
  • 无 — 纯谓词

范例已编译验证

http/validate_tour · Authority · 观察

		xrtHttpAuthorityValid(&Auth) ? 1

xrtHttpAuthorityPort函数

取得显式端口;省略或空端口使用调用方给出的默认值。

bool xrtHttpAuthorityPort(const xhttpauthority* pAuthority, uint16 iDefaultPort, uint16* pPort)

参数

参数方向约束说明
pAuthority输入非空authority
iDefaultPort输入—默认端口
pPort输出非空接收端口
返回值
返回含义失败时状态
true端口已写出—
false端口越界或参数错误输出不变
错误
  • xrt.http 域错误 — 端口超出 uint16

范例已编译验证

http/host · 端口 · 观察

	) || !xrtHttpAuthorityPort(&Host, 80u, &iPort) ) {

xrtHttpTargetParse函数

按方法严格解析 request-target;CONNECT 只接受带非空端口 authority,OPTIONS 星号须精确为 "*"。

bool xrtHttpTargetParse(xstrview Method, xstrview Text, xhttptarget* pTarget)

参数

参数方向约束说明
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 字段值。

bool xrtHttpTargetAuthority(const xhttptarget* pTarget, xstrview Host, xhttpauthority* pAuthority)

参数

参数方向约束说明
pTarget输入非空已解析 target
Host输入借用Host 字段值
pAuthority输出未对齐存储、不得覆盖输入接收 authority
返回值
返回含义失败时状态
true已写出—
false无可用 authority 或非法输出不变
错误
  • xrt.http 域错误

范例已编译验证

http/target · authority · 观察

	) || !xrtHttpTargetAuthority(
		&Target,
		XRT_STR_LITERAL("ignored.test"),
字段解析与写出

xrtHttpFieldValueValid函数

判断合法连续文本是否能安全作为字段值或 reason-phrase;空视图允许为 NULL/0。

bool xrtHttpFieldValueValid(xstrview Value)

参数

参数方向约束说明
Value输入借用待判定文本
返回值
返回含义失败时状态
true可安全作为字段值—
false含 CR/LF/NUL 等非法字节纯谓词
错误
  • 无 — 纯谓词

范例已编译验证

http/field_tour · 字段值 · 观察

		xrtHttpFieldValueValid(Fields[0].Value) ? 1

xrtHttpFieldParse函数

严格解析一行不含 CRLF 的 HTTP 字段;未对齐输出在返回前一次性发布。

bool xrtHttpFieldParse(xstrview Line, xhttpfield* pField)

参数

参数方向约束说明
Line输入借用、不含 CRLF字段行
pField输出非空、支持未对齐接收 Name/Value 借用视图
返回值
返回含义失败时状态
true已解析—
false语法错误输出不变
错误
  • xrt.http 域错误 — 名称非法或缺少冒号

范例已编译验证

http/base · 字段解析 · 观察

	if ( !xrtHttpFieldParse(
		XRT_STR_LITERAL("Connection: keep-alive, Upgrade"), &Field
	) ) {

xrtHttpFieldNext函数

严格读取不含终止空行的字段块;游标和字段输出支持未对齐存储。

xhttpnext xrtHttpFieldNext(xstrview Block, size_t* pOffset, xhttpfield* pField)

参数

参数方向约束说明
Block输入借用字段块(CRLF 分隔,不含终止空行)
pOffset输入/输出初始零游标
pField输出非空、未对齐可用接收条目
返回值
返回含义失败时状态
XHTTP_NEXT_ITEM取得一个字段—
XHTTP_NEXT_END块耗尽不设错
XHTTP_NEXT_ERROR语法错误游标不变
错误
  • xrt.http 域错误

范例已编译验证

http/field_tour · 块迭代 · 观察

		while ( xrtHttpFieldNext(SV(sBlock), &iOffset, &Field) ==

xrtHttpFieldBlockCount函数

严格统计完整字段块;空字段块成功返回零。

bool xrtHttpFieldBlockCount(xstrview Block, size_t* pCount)

参数

参数方向约束说明
Block输入借用字段块
pCount输出非空、未对齐可用接收计数
返回值
返回含义失败时状态
true计数已写出—
false语法错误计数不变
错误
  • xrt.http 域错误

范例已编译验证

http/field_tour · 块统计 · 观察

	if ( !xrtHttpFieldBlockCount(SV(sBlock), &iCount) || (iCount != 3u) ) {

xrtHttpFieldWrite函数

写出单个字段行及 CRLF;描述符和长度输出支持未对齐存储。

bool xrtHttpFieldWrite(const xhttpfield* pField, void* pOutput, size_t iCapacity, size_t* pSize)

参数

参数方向约束说明
pField输入非空字段描述符
pOutput输出可空空+零容量 = 查长度
iCapacity输入—容量
pSize输出可空实际/所需长度
返回值
返回含义失败时状态
true已写出(含 CRLF)—
false容量不足或参数错误输出不变
错误
  • XERR_ARGUMENT — 指针为空或视图非法
  • XERR_RANGE — 容量不足

范例已编译验证

http/field_tour · 写出 · 观察

		(void)xrtHttpFieldWrite(&Fields[0], Buffer, sizeof(Buffer), &iSize);

xrtHttpFieldBlockWrite函数

写出字段数组及最终空行(块终止 CRLFCRLF)。

bool xrtHttpFieldBlockWrite(const xhttpfield* pFields, size_t iCount, void* pOutput, size_t iCapacity, size_t* pSize)

参数

参数方向约束说明
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 大小写不敏感规则比较字段名称。

bool xrtHttpFieldNameEqual(xstrview Left, xstrview Right)

参数

参数方向约束说明
Left输入借用左名称
Right输入借用右名称
返回值
返回含义失败时状态
true相等—
false不等纯比较
错误
  • 无 — 纯比较

范例已编译验证

http/field_tour · 查找 · 观察

		xrtHttpFieldNameEqual(SV("connection"), SV("Connection")) ? 1

xrtHttpFieldFind函数

从指定位置查找字段;未找到返回 XRT_NPOS。

size_t xrtHttpFieldFind(const xhttpfield* pFields, size_t iCount, xstrview Name, size_t iStart)

参数

参数方向约束说明
pFields输入借用数组、可未对齐字段数组
iCount输入—条目数
Name输入借用查找名称
iStart输入—起始下标
返回值
返回含义失败时状态
>= 0首个命中下标—
XRT_NPOS未找到(正常结果)不设错
错误
  • 无 — 未找到是查询结果

范例已编译验证

http/field_tour · 查找 · 观察

		iFound = xrtHttpFieldFind(Fields, 3u, SV("Connection"), 0u);

xrtHttpFieldGet函数

返回原数组中第一个同名字段的借用地址,未找到返回空指针。

const xhttpfield* xrtHttpFieldGet(const xhttpfield* pFields, size_t iCount, xstrview Name)

参数

参数方向约束说明
pFields输入借用数组字段数组
iCount输入—条目数
Name输入借用查找名称
返回值
返回含义失败时状态
非空借用字段地址—
NULL未找到不设错
错误
  • 无 — 未找到是查询结果

范例已编译验证

http/field_tour · 查找 · 观察

		const xhttpfield* pGet = xrtHttpFieldGet(Fields, 3u,

xrtHttpFieldGetUnique函数

返回唯一同名字段的借用地址;重复时区分命中/重复/未找到。

xhttpnext xrtHttpFieldGetUnique(const xhttpfield* pFields, size_t iCount, xstrview Name, const xhttpfield** ppField)

参数

参数方向约束说明
pFields输入借用数组字段数组
iCount输入—条目数
Name输入借用查找名称
ppField输出非空、未对齐可用接收唯一命中地址
返回值
返回含义失败时状态
XHTTP_NEXT_ITEM唯一命中—
XHTTP_NEXT_END未找到不设错
XHTTP_NEXT_ERROR同名重复(协议错误)xrt.http 域错误
错误
  • xrt.http 域错误 — 同名字段出现多次

范例已编译验证

http/field_tour · 查找 · 观察

			xrtHttpFieldGetUnique(Fields, 3u, SV("Accept-Encoding"),

xrtHttpFieldCount函数

统计同名字段数量。

size_t xrtHttpFieldCount(const xhttpfield* pFields, size_t iCount, xstrview Name)

参数

参数方向约束说明
pFields输入借用数组字段数组
iCount输入—条目数
Name输入借用统计名称
返回值
返回含义失败时状态
>= 0同名字段数(零 = 无)—
错误
  • 无 — 纯统计

范例已编译验证

http/field_tour · 查找 · 观察

		xrtHttpFieldCount(Fields, 3u, SV("Connection")));
同名字段 token 游标

xrtHttpFieldTokenCursorInit函数

初始化可重复使用的同名字段 token-list 游标。

void xrtHttpFieldTokenCursorInit(xhttpfieldtokencursor* pCursor)

参数

参数方向约束说明
pCursor输出非空调用方存储
返回值
返回含义失败时状态
无纯初始化—
错误
  • 无 — 初始化不失败

范例已编译验证

http/field_tour · token 游标 · 观察

		xrtHttpFieldTokenCursorInit(&Cursor);

xrtHttpFieldTokenNext函数

跨重复同名字段读取 token-list 条目,保持字段与条目线路顺序;首次发布前完整验证全部同名字段。

xhttpnext xrtHttpFieldTokenNext(const xhttpfield* pFields, size_t iCount, xstrview Name, xhttpfieldtokencursor* pCursor, xstrview* pToken)

参数

参数方向约束说明
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 条目。

bool xrtHttpFieldTokenCount(const xhttpfield* pFields, size_t iCount, xstrview Name, size_t* pTokenCount)

参数

参数方向约束说明
pFields输入借用数组字段数组
iCount输入—条目数
Name输入借用目标字段名
pTokenCount输出非空接收合计
返回值
返回含义失败时状态
true合计已写出—
false任一字段非法计数不变
错误
  • xrt.http 域错误

范例已编译验证

http/field_tour · token 游标 · 观察

			(void)xrtHttpFieldTokenCount(Dup, 2u,

xrtHttpFieldTokenFind函数

完整验证并在重复同名字段中查找 token;返回值区分找到/未找到/错误。

xhttpnext xrtHttpFieldTokenFind(const xhttpfield* pFields, size_t iCount, xstrview Name, xstrview Token)

参数

参数方向约束说明
pFields输入借用数组字段数组
iCount输入—条目数
Name输入借用目标字段名
Token输入借用查找 token
返回值
返回含义失败时状态
XHTTP_NEXT_ITEM已产出一项—
XHTTP_NEXT_END遍历结束—
XHTTP_NEXT_ERROR失败—
错误
  • xrt.http 域错误 — 字段值非法

范例已编译验证

http/field_tour · token 游标 · 观察

			xrtHttpFieldTokenFind(Dup, 2u, SV("Accept-Encoding"),
quoted-string

xrtHttpQuotedValid函数

判断文本是否是一段完整、合法的 HTTP quoted-string。

bool xrtHttpQuotedValid(xstrview Quoted)

参数

参数方向约束说明
Quoted输入借用含首尾引号的文本
返回值
返回含义失败时状态
true合法—
false非法纯谓词
错误
  • 无 — 纯谓词

范例已编译验证

http/param_tour · quoted · 观察

	(void)xrtHttpQuotedValid(SV("\"part;42\""));

xrtHttpQuotedRead函数

解码完整 quoted-string;空输出查询长度且不附加零字符。

bool xrtHttpQuotedRead(xstrview Quoted, void* pOutput, size_t iCapacity, size_t* pSize)

参数

参数方向约束说明
Quoted输入借用quoted-string
pOutput输出可空解码输出
iCapacity输入—容量
pSize输出可空解码长度
返回值
返回含义失败时状态
true已解码(删除转义)—
false非法或容量不足输出不变
错误
  • xrt.http 域错误 — 非法 quoted-string
  • XERR_RANGE — 容量不足

范例已编译验证

http/param_tour · quoted · 观察

	if ( xrtHttpQuotedRead(SV("\"part;42\""), Buffer, sizeof(Buffer) - 1u,

xrtHttpQuotedWrite函数

写出带引号和必要转义的 quoted-string;不附加零字符。

bool xrtHttpQuotedWrite(xstrview Value, void* pOutput, size_t iCapacity, size_t* pSize)

参数

参数方向约束说明
Value输入借用未转义语义值
pOutput输出可空编码输出
iCapacity输入—容量
pSize输出可空编码长度
返回值
返回含义失败时状态
true已编码—
false容量不足或参数错误输出不变
错误
  • XERR_ARGUMENT — 指针为空或视图非法
  • XERR_RANGE — 容量不足

范例已编译验证

http/param_tour · quoted · 观察

	(void)xrtHttpQuotedWrite(SV("a\"b"), Buffer, sizeof(Buffer), &iSize);

xrtHttpQuotedBuild函数

构建零结尾 quoted-string;返回值由 xrtFree 释放。

str xrtHttpQuotedBuild(xstrview Value, size_t* pSize)

参数

参数方向约束说明
Value输入借用语义值
pSize输出可空接收长度
返回值
返回含义失败时状态
非空零结尾编码结果—
NULL参数错误或 OOM错误经 xrtGetError() 报告
错误
  • XERR_ARGUMENT — 指针为空或视图非法
  • XERR_MEMORY

范例已编译验证

http/param_tour · quoted · 观察

	sBuilt = xrtHttpQuotedBuild(SV("a\"b"), NULL);
参数

xrtHttpParamNext函数

严格读取分号参数;错误不推进游标并清空结果。

xhttpnext xrtHttpParamNext(xstrview Parameters, size_t* pOffset, xhttpparam* pParam)

参数

参数方向约束说明
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函数

严格统计完整参数列表;空列表或失败分别发布零。

bool xrtHttpParamCount(xstrview Parameters, size_t* pCount)

参数

参数方向约束说明
Parameters输入借用参数串
pCount输出非空、未对齐可用接收计数
返回值
返回含义失败时状态
true计数已写出—
false语法错误计数不变
错误
  • xrt.http 域错误

范例已编译验证

http/param_tour · 统计 · 观察

	if ( !xrtHttpParamCount(SV(sParams), &iCount) || (iCount != 2u) ) {

xrtHttpParamFind函数

严格查找参数并验证全部后缀;未命中或错误时清空结果。

xhttpnext xrtHttpParamFind(xstrview Parameters, xstrview Name, xhttpparam* pParam)

参数

参数方向约束说明
Parameters输入借用参数串
Name输入借用查找名称
pParam输出非空接收结果
返回值
返回含义失败时状态
XHTTP_NEXT_ITEM命中—
XHTTP_NEXT_END未命中(不设错)—
XHTTP_NEXT_ERROR语法错误xrt.http 域错误
错误
  • xrt.http 域错误

范例已编译验证

http/param_tour · 查找 · 观察

	if ( xrtHttpParamFind(SV(sParams), SV("boundary"), &Param) ==

xrtHttpParamTokenValid函数

判断参数是否带值且解码语义值为非空 token;不修改线程错误。

bool xrtHttpParamTokenValid(const xhttpparam* pParam)

参数

参数方向约束说明
pParam输入非空、可未对齐参数描述符
返回值
返回含义失败时状态
true值是非空 token—
false无值/非 token 语义纯谓词
错误
  • 无 — 纯谓词(协议参数要求 token 语义时使用)

范例已编译验证

http/param_tour · token 语义 · 观察

		xrtHttpParamTokenValid(&TokenParam) ? 1

xrtHttpParamTokenEqual函数

按 ASCII 大小写不敏感规则比较参数的解码 token 值;纯谓词。

bool xrtHttpParamTokenEqual(const xhttpparam* pParam, xstrview Token)

参数

参数方向约束说明
pParam输入非空参数描述符
Token输入借用比较目标
返回值
返回含义失败时状态
true相等—
false不等纯谓词
错误
  • 无 — 纯谓词

范例已编译验证

http/param_tour · token 语义 · 观察

		xrtHttpParamTokenEqual(&TokenParam, SV("utf-8")) ? 1

xrtHttpParamValueCursorInit函数

初始化参数值逐字节游标。

void xrtHttpParamValueCursorInit(xhttpparamvaluecursor* pCursor)

参数

参数方向约束说明
pCursor输出非空调用方存储
返回值
返回含义失败时状态
无纯初始化—
错误
  • 无 — 初始化不失败

范例已编译验证

http/param_tour · 值游标 · 观察

		xrtHttpParamValueCursorInit(&Cursor);

xrtHttpParamValueNext函数

逐字节读取参数的解码语义值;首次调用完整验证并绑定参数;输入在迭代结束前必须不变。

xhttpnext xrtHttpParamValueNext(const xhttpparam* pParam, xhttpparamvaluecursor* pCursor, uint8* pByte)

参数

参数方向约束说明
pParam输入非空参数描述符
pCursor输入/输出已初始化游标
pByte输出非空接收一个解码字节
返回值
返回含义失败时状态
XHTTP_NEXT_ITEM已产出一项—
XHTTP_NEXT_END遍历结束不设错误
XHTTP_NEXT_ERROR解析失败xrt.http 域错误
错误
  • xrt.http 域错误 — 值非法

范例已编译验证

http/param_tour · 值游标 · 观察

		while ( xrtHttpParamValueNext(&Param, &Cursor, &iByte) ==

xrtHttpParamValueWrite函数

解码参数值;token 复制,quoted-string 删除转义。

bool xrtHttpParamValueWrite(const xhttpparam* pParam, void* pOutput, size_t iCapacity, size_t* pSize)

参数

参数方向约束说明
pParam输入非空、可未对齐参数描述符
pOutput输出可空解码输出
iCapacity输入—容量
pSize输出可空解码长度
返回值
返回含义失败时状态
true已解码—
false容量不足或值非法输出不变
错误
  • XERR_RANGE — 容量不足
  • xrt.http 域错误 — quoted-string 非法

范例已编译验证

http/param · 解码 · 观察

		if ( !xrtHttpParamValueWrite(
			&Param, Value, sizeof(Value), &iSize
		) ) {

xrtHttpParamWrite函数

写出单个参数;QUOTED 转义正文,NONE 省略等号和值。

bool xrtHttpParamWrite(xstrview Name, xstrview Value, uint32 iFlags, void* pOutput, size_t iCapacity, size_t* pSize)

参数

参数方向约束说明
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 释放。

str xrtHttpParamBuild(xstrview Name, xstrview Value, uint32 iFlags, size_t* pSize)

参数

参数方向约束说明
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 参数)。

bool xrtHttpParamHostValid(const xhttpparam* pParam)

参数

参数方向约束说明
pParam输入非空参数描述符
返回值
返回含义失败时状态
true值是合法 Host—
false无值或非法 Host纯谓词
错误
  • 无 — 纯谓词

范例已编译验证

http/param_tour · host 参数 · 观察

		xrtHttpParamHostValid(&HostParam) ? 1

xrtHttpDirectiveNext函数

读取逗号分隔 name[=value] 指令的下一项;空列表项被忽略,值可为 token 或 quoted-string。

xhttpnext xrtHttpDirectiveNext(xstrview Directives, size_t* pOffset, xhttpparam* pDirective)

参数

参数方向约束说明
Directives输入借用指令列表
pOffset输入/输出初始零游标
pDirective输出非空、未对齐可用接收条目
返回值
返回含义失败时状态
XHTTP_NEXT_ITEM已产出一项—
XHTTP_NEXT_END遍历结束不设错误
XHTTP_NEXT_ERROR解析失败xrt.http 域错误
错误
  • xrt.http 域错误

范例已编译验证

http/param_tour · 指令 · 观察

		while ( xrtHttpDirectiveNext(SV(sDirectives), &iOffset,
指令

xrtHttpDirectiveCount函数

严格统计完整指令列表;空项不计数,失败发布零。

bool xrtHttpDirectiveCount(xstrview Directives, size_t* pCount)

参数

参数方向约束说明
Directives输入借用指令列表
pCount输出非空接收计数
返回值
返回含义失败时状态
true计数已写出—
false语法错误计数不变
错误
  • xrt.http 域错误

范例已编译验证

http/param_tour · 指令 · 观察

		(void)xrtHttpDirectiveCount(SV(sDirectives), &iCount);

xrtHttpDirectiveFind函数

查找首个指令并验证全部后缀;未命中或错误时清空。

xhttpnext xrtHttpDirectiveFind(xstrview Directives, xstrview Name, xhttpparam* pDirective)

参数

参数方向约束说明
Directives输入借用指令列表
Name输入借用查找名称
pDirective输出非空接收结果
返回值
返回含义失败时状态
XHTTP_NEXT_ITEM已产出一项—
XHTTP_NEXT_END遍历结束—
XHTTP_NEXT_ERROR失败—
错误
  • xrt.http 域错误

范例已编译验证

http/param_tour · 指令 · 观察

			xrtHttpDirectiveFind(SV(sDirectives), SV("no-store"),

常量索引常量

以下常量在本页所属头文件中定义,语义见公共头注释。

常量说明
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见头文件注释