模块契约WebSocket 协议底座

所有权与错误

帧、消息、Close、握手和扩展解析器只借用输入视图;成功后也不会接管输入。所有写出函数使用 调用方缓冲,并在容量不足时返回所需长度,不留下半个结构。Upgrade 结果拥有 Accept 与扩展响应, 子协议暂时借用 HTTP Header;Attach 会在消费 Header 前复制它。Inflater、Deflater 和 Stream 持有资源,必须由对应 Destroy 释放。

协议错误通过稳定的模块错误码和 xrtGetError/结构化错误链表达。输入不足不是协议错误; 只有确定违反协议、参数范围、资源上限、输出回调或压缩状态时才进入失败路径。

线程

帧、消息与扩展协商 API 为无共享状态的纯函数,可任意线程并发调用;流对象与压缩/解压上下文为单拥有者对象,绑定其所属 Worker 或创建线程。

模块边界

层次模块能力
帧websocket_frame帧头解析、帧头写出、分片 mask
关闭websocket_closeClose code、UTF-8 reason、payload 解析与写出
消息websocket_message分片、控制帧穿插、角色规则、UTF-8 和消息上限
握手websocket_handshake、websocket_keygenKey、Accept、版本、子协议和 Upgrade 字段
扩展websocket_extension、websocket_deflate扩展字段与 permessage-deflate 协商
压缩websocket_inflater、websocket_deflater有界、流式、可复用的消息压缩与解压
Upgradewebsocket_upgrade、websocket_upgrade_deflate完整 HTTP/1.1 Upgrade 校验、字段写出和压缩协商
通信websocket_stream、websocket_stream_tlsTCP/TLS 接管、消息事件、背压和关闭握手
组合websocket_upgrade_stream把基础协商结果直接映射为 Stream 配置,不强制带入压缩
压缩组合websocket_upgrade_stream + websocket_upgrade_deflate + websocket_stream_deflateUpgrade、Stream 与 permessage-deflate 完整链路

每层都可以独立裁剪。仅选择帧层不会带入 HTTP、网络、TLS 或压缩;Upgrade 层才依赖 HTTP/1; TCP Stream、TLS 适配和压缩发送分别独立启用。websocket_upgrade_stream 本身不依赖压缩,只有同时 选择 websocket_upgrade_deflate 与 websocket_stream_deflate 才启用协商后的压缩链路。任何核心组合 都不会带入 Future、协程或任务系统。

高性能收发

发送端使用 xrtWsFrameWrite 在调用方栈内存或固定小缓冲中生成最多 14 字节的帧头,随后将帧头和 payload 作为两个片段直接交给 xrtNetStreamSendRefs、TLS 写入器或调用方自己的向量发送接口。 模块不会聚合、复制或暂存完整报文。客户端 payload 必须使用 xrtWsMask 处理;该函数接受 offset, 因此可以跨任意数量的输入分片保持 mask 相位。

接收端先向 xrtWsFrameParse 提供当前可见字节。返回 XWS_FRAME_MORE 时继续累积最多 14 字节帧头; 返回 XWS_FRAME_READY 后,调用方按 PayloadSize 直接消费网络缓冲中的 payload。每个分片依次经过 xrtWsMessageFrameBegin、xrtWsMessagePayload 和 xrtWsMessageFrameEnd,正文仍借用原网络缓冲, 无需构造完整消息副本。

这种边界允许应用自行选择纯协议原语,或使用 xwsstream 完成标准事件驱动通信。更高层仍可在 同一底座上组合同步等待、Future 或协程,核心不会隐藏背压。

轻量 Stream

xrtWsStreamAttach 与 xrtWsStreamAttachTls 接管已经完成 Upgrade 的 TCP/TLS 调用方引用。 iPrefix 是已经验证但尚未消费的 HTTP Header 长度:接管时先复制协商出的子协议,再精确消费 Header,最后异步处理同一缓冲中的帧余量。失败不会部分接管传输。

接收事件按 MessageBegin、零个或多个 MessageData、MessageEnd 发布。正文视图只在当前同步 回调有效,Stream 不聚合完整消息,也不为每条连接预分配固定 8 KiB 缓冲;TCP/TLS 现有块链直接 进入帧和消息状态机。TLS 帧头跨 record 时,Stream 通过受 PlainLimit 限制的 ReadMore 路径 累积最多 14 字节的完整帧头,不会因保留一个不完整前缀而停住。

发送 API 提供 copy 和可选 ref 路径,压缩发送按需创建 Deflater。SendLimit 是 WebSocket 与 底层传输待发量的统一硬边界,达到上限返回 XNET_RESULT_AGAIN;Backpressure、Writable 和 Drain 给出恢复边沿。Ping 可自动回复,Close 保证唯一发送、超时和对端终态快照。

帧与消息契约

xwsframe 描述 FIN、RSV、opcode、mask 和 63 位 payload 长度。严格解析拒绝:

  • 非最短长度编码和超过 63 位的长度;
  • 保留或未允许的 opcode、RSV 位;
  • 分片控制帧或超过 125 字节的控制帧;
  • 不符合客户端/服务端角色的 mask;
  • 输出范围重叠、地址回绕和无效配置。

xrtWsFrameConfigInit 的 Mask 默认为 XWS_MASK_ANY,只用于角色未知的协议工具和 中间层。端点直接使用帧解析器时,服务端必须改为 XWS_MASK_REQUIRED,客户端必须改为 XWS_MASK_FORBIDDEN;xwsstream 已按连接角色自动设置该策略。

xwsmessagestate 不保存完整消息,只记录协议状态。它验证 continuation 顺序、Text UTF-8、 控制帧穿插、Close payload、扩展位和解码后消息上限。Ping/Pong/Close 由返回的消息标志交给调用方处理; 核心不自动回复、不自动关闭网络流。消息状态配置默认 MaxSize = SIZE_MAX,因为这一层不聚合正文; 任何收集完整消息或持有正文的上层都必须设置符合自身内存预算的有限上限。面向不可信对端时, xrtWsMessageConfigInitSafe 以 XWS_MESSAGE_SIZE_SAFE_DEFAULT(16 MiB)作为默认 消息上限初始化配置,防止恶意超长消息耗尽内存;需要无上限流时必须显式恢复 MaxSize = SIZE_MAX。XRT stream 层已提供自己的连接级默认限制。

握手与扩展

握手函数只处理 HTTP 字段值:

  • 验证或生成 Sec-WebSocket-Key;
  • 计算并验证 Sec-WebSocket-Accept;
  • 解析、检查、选择和写出子协议列表;
  • 检查方法、状态、版本、Upgrade、Connection、Host 和正文约束;
  • 遍历、计数和写出扩展及参数。

xrtWsUpgradeRequestCheck 和 xrtWsUpgradeResponseCheck 对完整 xhttp1head 执行角色相关校验, 包括唯一 Host、GET/101、HTTP/1.1、Key/Accept 绑定、版本 13、Connection、Upgrade、正文禁止、 子协议和扩展协商。重复字段按线路顺序处理,重复子协议和歧义响应会被拒绝。

xrtWsUpgradeRequestFields、xrtWsUpgradeResponseFields 只填充调用方字段描述符,可继续与 xrtHttp1RequestWrite、xrtHttp1ResponseWrite 组合。TCP 使用 xrtHttp1*ParseBuffer,TLS 使用 xrtHttp1*ParseTls;后者在 Header 跨 TLS record 时自动请求有界增量明文。成功后把 Head.Bytes 直接传给 Attach,Upgrade 后已经到达的帧不会丢失。

生产客户端必须通过 xrtWsKeyGenerate 使用安全随机数生成 Key;示例固定值只能用于协议测试。

permessage-deflate

协商层严格区分 offer 与 response,拒绝重复参数、非法 window bits、未知响应能力和不一致的 context takeover。xrtWsDeflateDirection 将协商结果转换为单方向运行参数。

xwsinflater 与 xwsdeflater 都是流式对象:

  • 输入和输出按分片推进,不聚合整条消息;
  • 输出通过回调直接进入调用方缓冲或网络发送队列;
  • 解压总量受消息上限和 Inflate 上限双重约束;
  • no-context-takeover 在消息边界重置字典;
  • xrtWsDeflaterBound 可在写入前完成容量规划;
  • 回调失败、OOM 或数据错误后具有明确的 reset、abort 或 destroy 路径。

RSV1 只允许出现在压缩消息的首个数据帧,continuation 不重复 RSV1,控制帧永不压缩。

扩展能力

连接对象、Writer、Future/协程桥接、重连与心跳策略、连接组和广播属于独立发布的 xws 扩展。基础 TCP/TLS 通信、关闭、背压和连接级压缩留在 XRT;xws 在这条稳定路径上提供高级抽象。

测试与示例

tests/websocket/ 覆盖固定向量、分块矩阵、属性测试、no-allocation、OOM、协议模糊测试,以及 真实 Select 回环上的 ws/wss Upgrade。集成测试会拆分 TLS Header 和一字节帧头,并验证压缩 发送、解压接收和完整 Close。examples/websocket/ 不依赖高级连接对象。

xwsopcode类型

WebSocket 标准数据帧和控制帧操作码。

值语义
XWS_OPCODE_CONTINUATION延续帧(0x0)
XWS_OPCODE_TEXT文本
XWS_OPCODE_BINARY二进制
XWS_OPCODE_CLOSE关闭帧(0x8)
XWS_OPCODE_PINGPing(0x9)
XWS_OPCODE_PONGPong(0xA)
typedef enum xwsopcode { XWS_OPCODE_CONTINUATION = 0x0, XWS_OPCODE_TEXT = 0x1, XWS_OPCODE_BINARY = 0x2, XWS_OPCODE_CLOSE = 0x8, XWS_OPCODE_PING = 0x9, XWS_OPCODE_PONG = 0xA } xwsopcode;

xwsframeflag类型

帧标志使用逻辑位,调用方不需要了解线路字节布局。

值语义
XWS_FRAME_FIN最终分片
XWS_FRAME_MASKED已掩码
XWS_FRAME_RSV1RSV1(压缩)
XWS_FRAME_RSV2RSV2(保留)
XWS_FRAME_RSV3RSV3(保留)
typedef enum xwsframeflag { XWS_FRAME_FIN = UINT32_C(0x00000001), XWS_FRAME_MASKED = UINT32_C(0x00000002), XWS_FRAME_RSV1 = UINT32_C(0x00000004), XWS_FRAME_RSV2 = UINT32_C(0x00000008), XWS_FRAME_RSV3 = UINT32_C(0x00000010)

xwsmaskpolicy类型

接收方向使用角色对应的掩码策略,ANY 仅适合协议工具和中间层。

值语义
XWS_MASK_ANY任意
XWS_MASK_REQUIRED必须掩码(客户端)
XWS_MASK_FORBIDDEN禁止掩码(服务端)
typedef enum xwsmaskpolicy { XWS_MASK_ANY = 0, XWS_MASK_REQUIRED, XWS_MASK_FORBIDDEN } xwsmaskpolicy;

xwsframestatus类型

帧头解析只区分协议错误、数据不足和头部就绪。

值语义
XWS_FRAME_ERROR失败
XWS_FRAME_MORE需要更多输入
XWS_FRAME_READY已解析完整帧
typedef enum xwsframestatus { XWS_FRAME_ERROR = -1, XWS_FRAME_MORE = 0, XWS_FRAME_READY = 1 } xwsframestatus;

xwsframeerror类型

帧层错误码覆盖参数、扩展策略和 RFC 6455 线路约束。

值语义
XWS_FRAME_ERROR_ARGUMENT参数非法
XWS_FRAME_ERROR_CONFIG配置非法
XWS_FRAME_ERROR_RSV失败
XWS_FRAME_ERROR_OPCODE失败
XWS_FRAME_ERROR_MASK失败
XWS_FRAME_ERROR_LENGTH失败
XWS_FRAME_ERROR_CONTROL失败
XWS_FRAME_ERROR_CLOSE失败
XWS_FRAME_ERROR_OUTPUT输出回调失败
typedef enum xwsframeerror { XWS_FRAME_ERROR_ARGUMENT = 1, XWS_FRAME_ERROR_CONFIG, XWS_FRAME_ERROR_RSV, XWS_FRAME_ERROR_OPCODE, XWS_FRAME_ERROR_MASK, XWS_FRAME_ERROR_LENGTH, XWS_FRAME_ERROR_CONTROL, XWS_FRAME_ERROR_CLOSE, XWS_FRAME_ERROR_OUTPUT } xwsframeerror;

xwsframeconfig类型

帧配置不持有资源;AllowedRsv 使用 XWS_FRAME_RSV* 位。 AllowedOpcodes 的第 n 位表示是否允许操作码 n。

字段类型语义
MaxPayloaduint64MaxPayload
AllowedOpcodesuint16AllowedOpcodes
AllowedRsvuint16AllowedRsv
MaskxwsmaskpolicyMask
typedef struct xwsframeconfig { uint64 MaxPayload; uint16 AllowedOpcodes; uint16 AllowedRsv; xwsmaskpolicy Mask; } xwsframeconfig;

xwsframeerrorinfo类型

错误位置从帧头首字节开始计数。

字段类型语义
Codexwsframeerror错误码
Offsetsize_t偏移量
typedef struct xwsframeerrorinfo { xwsframeerror Code; size_t Offset; } xwsframeerrorinfo;

xwsframe类型

帧只描述头部和负载长度,不借用负载,也不要求负载已经到达。 HeadSize 在解析成功后有效,封包时由模块重新计算。

字段类型语义
Flagsuint32标志位
Opcodeuint8Opcode
PayloadSizeuint64PayloadSize
HeadSizesize_tHeadSize
typedef struct xwsframe { uint32 Flags; uint8 Opcode; uint8 Mask[XWS_MASK_SIZE]; uint64 PayloadSize; size_t HeadSize; } xwsframe;

xwsclosecode类型

1005、1006 和 1015 只表示本地观察结果,不允许写入 Close 帧。 Code 为零由 xwsclose 专门表示线上负载没有携带状态码。

值语义
XWS_CLOSE_NORMAL1000 正常关闭
XWS_CLOSE_GOING_AWAY1001 端点离开
XWS_CLOSE_PROTOCOL协议非法
XWS_CLOSE_UNSUPPORTED不支持
XWS_CLOSE_NO_STATUS1005 无状态码
XWS_CLOSE_ABNORMAL1006 异常关闭(无关闭帧)
XWS_CLOSE_INVALID_DATA无效数据损坏
XWS_CLOSE_POLICY1008 策略违反
XWS_CLOSE_TOO_BIG1009 消息过大
XWS_CLOSE_EXTENSION_REQUIRED1010 缺少必需扩展
XWS_CLOSE_INTERNAL内部错误
XWS_CLOSE_RESTART1012 服务重启
XWS_CLOSE_TRY_AGAINTRY暂不可推进
XWS_CLOSE_BAD_GATEWAY1014 网关错误
XWS_CLOSE_TLSTLS 关闭
typedef enum xwsclosecode { XWS_CLOSE_NORMAL = 1000, XWS_CLOSE_GOING_AWAY = 1001, XWS_CLOSE_PROTOCOL = 1002, XWS_CLOSE_UNSUPPORTED = 1003, XWS_CLOSE_NO_STATUS = 1005, XWS_CLOSE_ABNORMAL = 1006, XWS_CLOSE_INVALID_DATA = 1007, XWS_CLOSE_POLICY = 1008, XWS_CLOSE_TOO_BIG = 1009, XWS_CLOSE_EXTENSION_REQUIRED = 1010, XWS_CLOSE_INTERNAL = 1011, XWS_CLOSE_RESTART = 1012, XWS_CLOSE_TRY_AGAIN = 1013, XWS_CLOSE_BAD_GATEWAY = 1014, XWS_CLOSE_TLS = 1015 } xwsclosecode;

xwscloseerror类型

Close 负载错误区分参数、协议状态码、UTF-8、长度和输出容量。

值语义
XWS_CLOSE_ERROR_ARGUMENT参数非法
XWS_CLOSE_ERROR_SIZE尺寸
XWS_CLOSE_ERROR_CODE失败
XWS_CLOSE_ERROR_UTF8失败
XWS_CLOSE_ERROR_OUTPUT写出失败
typedef enum xwscloseerror { XWS_CLOSE_ERROR_ARGUMENT = 1, XWS_CLOSE_ERROR_SIZE, XWS_CLOSE_ERROR_CODE, XWS_CLOSE_ERROR_UTF8, XWS_CLOSE_ERROR_OUTPUT } xwscloseerror;

xwsclose类型

关闭原因直接借用原始负载;Code 为零表示负载为空。 结构不拥有内存,也不会把本地合成的 1005 写回线路。

字段类型语义
Codeuint16错误码
Reasonxstrview原因文本
typedef struct xwsclose { uint16 Code; xstrview Reason; } xwsclose;

xwsmessageflag类型

消息事件标志同时描述逻辑消息边界、控制帧和扩展变换。

值语义
XWS_MESSAGE_BEGIN纯消息
XWS_MESSAGE_END纯消息
XWS_MESSAGE_CONTROL纯消息
XWS_MESSAGE_EXTENDED纯消息
XWS_MESSAGE_COMPRESSED消息已压缩
typedef enum xwsmessageflag { XWS_MESSAGE_BEGIN = UINT32_C(0x00000001), XWS_MESSAGE_END = UINT32_C(0x00000002), XWS_MESSAGE_CONTROL = UINT32_C(0x00000004), XWS_MESSAGE_EXTENDED = UINT32_C(0x00000008), XWS_MESSAGE_COMPRESSED = UINT32_C(0x00000010)

xwsmessageerror类型

消息层错误可稳定映射到协议错误、非法数据或消息过大关闭码。

值语义
XWS_MESSAGE_ERROR_ARGUMENT参数非法
XWS_MESSAGE_ERROR_CONFIG配置非法
XWS_MESSAGE_ERROR_STATE状态非法
XWS_MESSAGE_ERROR_OPCODE失败
XWS_MESSAGE_ERROR_FRAGMENT失败
XWS_MESSAGE_ERROR_RSV失败
XWS_MESSAGE_ERROR_PAYLOAD失败
XWS_MESSAGE_ERROR_SIZE尺寸
XWS_MESSAGE_ERROR_UTF8失败
XWS_MESSAGE_ERROR_CLOSE失败即关闭
typedef enum xwsmessageerror { XWS_MESSAGE_ERROR_ARGUMENT = 1, XWS_MESSAGE_ERROR_CONFIG, XWS_MESSAGE_ERROR_STATE, XWS_MESSAGE_ERROR_OPCODE, XWS_MESSAGE_ERROR_FRAGMENT, XWS_MESSAGE_ERROR_RSV, XWS_MESSAGE_ERROR_PAYLOAD, XWS_MESSAGE_ERROR_SIZE, XWS_MESSAGE_ERROR_UTF8, XWS_MESSAGE_ERROR_CLOSE } xwsmessageerror;

xwsmessageconfig类型

MaxSize 限制扩展解码后的单条消息字节数;零表示只允许空消息。 三个 RSV 位图分别描述扩展允许在哪类帧上出现,默认全部禁止。

字段类型语义
MaxSizesize_tMaxSize
FirstRsvuint16FirstRsv
ContinuationRsvuint16ContinuationRsv
ControlRsvuint16ControlRsv
ValidateTextboolValidateText
typedef struct xwsmessageconfig { size_t MaxSize; uint16 FirstRsv; uint16 ContinuationRsv; uint16 ControlRsv; bool ValidateText; } xwsmessageconfig;

xwsmessageinfo类型

帧开始时发布的只读语义,不借用帧对象,也不持有负载。

字段类型语义
Flagsuint32标志位
Rsvuint16Rsv
Opcodeuint8Opcode
FrameOpcodeuint8FrameOpcode
PayloadSizeuint64PayloadSize
Offsetsize_t偏移量
typedef struct xwsmessageinfo { uint32 Flags; uint16 Rsv; uint8 Opcode; uint8 FrameOpcode; uint64 PayloadSize; size_t Offset; } xwsmessageinfo;

xwsmessageerrorinfo类型

可选错误详情给出消息内偏移和须回发给对端的 Close 状态码。

字段类型语义
Codexwsmessageerror错误码
CloseCodeuint16CloseCode
Offsetsize_t偏移量
typedef struct xwsmessageerrorinfo { xwsmessageerror Code; uint16 CloseCode; size_t Offset; } xwsmessageerrorinfo;

xwsmessagestate类型

消息状态可放在连接对象内;它只保存有限状态、两个 UTF-8 校验器和 Close 状态码前缀,不缓存帧负载或完整消息。

字段类型语义
Configxwsmessageconfig配置
Utf8xutf8stateUtf8
CloseUtf8xutf8stateCloseUtf8
Sizesize_t字节数
FrameSizesize_tFrameSize
FramePayloadSizeuint64FramePayloadSize
MessageRsvuint32MessageRsv
FrameRsvuint32FrameRsv
Opcodeuint8Opcode
FrameOpcodeuint8FrameOpcode
CloseHeadSizeuint8CloseHeadSize
FragmentedboolFragmented
FrameActiveboolFrameActive
FrameFinalboolFrameFinal
InitializedboolInitialized
FailedboolFailed
ClosedboolClosed
typedef struct xwsmessagestate { xwsmessageconfig Config; xutf8state Utf8; xutf8state CloseUtf8; size_t Size; size_t FrameSize; uint64 FramePayloadSize; uint32 MessageRsv; uint32 FrameRsv; uint8 Opcode; uint8 FrameOpcode; uint8 CloseHead[2]; uint8 CloseHeadSize; bool Fragmented; bool FrameActive; bool FrameFinal; bool Initialized; bool Failed; bool Closed; } xwsmessagestate;

xwshandshakeerror类型

握手错误码覆盖纯协议工具和后续 HTTP/1.1 Upgrade 层。

值语义
XWS_HANDSHAKE_ERROR_ARGUMENT参数非法
XWS_HANDSHAKE_ERROR_KEY失败
XWS_HANDSHAKE_ERROR_ACCEPT失败
XWS_HANDSHAKE_ERROR_PROTOCOL协议非法
XWS_HANDSHAKE_ERROR_EXTENSION失败
XWS_HANDSHAKE_ERROR_METHOD失败
XWS_HANDSHAKE_ERROR_VERSION失败
XWS_HANDSHAKE_ERROR_HOST失败
XWS_HANDSHAKE_ERROR_UPGRADE失败
XWS_HANDSHAKE_ERROR_CONNECTION失败
XWS_HANDSHAKE_ERROR_BODY失败
XWS_HANDSHAKE_ERROR_STATUS失败
XWS_HANDSHAKE_ERROR_FIELD失败
XWS_HANDSHAKE_ERROR_OUTPUT输出失败
XWS_HANDSHAKE_ERROR_RANDOM随机源失败
typedef enum xwshandshakeerror { XWS_HANDSHAKE_ERROR_ARGUMENT = 1, XWS_HANDSHAKE_ERROR_KEY, XWS_HANDSHAKE_ERROR_ACCEPT, XWS_HANDSHAKE_ERROR_PROTOCOL, XWS_HANDSHAKE_ERROR_EXTENSION, XWS_HANDSHAKE_ERROR_METHOD, XWS_HANDSHAKE_ERROR_VERSION, XWS_HANDSHAKE_ERROR_HOST, XWS_HANDSHAKE_ERROR_UPGRADE, XWS_HANDSHAKE_ERROR_CONNECTION, XWS_HANDSHAKE_ERROR_BODY, XWS_HANDSHAKE_ERROR_STATUS, XWS_HANDSHAKE_ERROR_FIELD, XWS_HANDSHAKE_ERROR_OUTPUT, XWS_HANDSHAKE_ERROR_RANDOM } xwshandshakeerror;

xwsrole类型

本地端点角色同时用于协议方向、掩码规则和扩展协商。

值语义
XWS_ROLE_CLIENTXWSROLE客户端角色
XWS_ROLE_SERVER服务端角色
typedef enum xwsrole { XWS_ROLE_CLIENT = 0, XWS_ROLE_SERVER } xwsrole;

xwsextension类型

扩展名称和参数段都借用 Sec-WebSocket-Extensions 原字段值。 Parameters 不包含名称后的第一个分号,空视图表示没有参数。

字段类型语义
Namexstrview名称
ParametersxstrviewParameters
typedef struct xwsextension { xstrview Name; xstrview Parameters; } xwsextension;

xwsdeflateflag类型

标志同时表达参数是否出现,以及 offer 中 client 窗口是否省略值。

值语义
XWS_DEFLATE_SERVER_NO_CONTEXT服务端角色NOCONTEXT
XWS_DEFLATE_CLIENT_NO_CONTEXT客户端角色NOCONTEXT
XWS_DEFLATE_SERVER_MAX_WINDOW服务端角色上限WINDOW
XWS_DEFLATE_CLIENT_MAX_WINDOW客户端角色上限WINDOW
XWS_DEFLATE_CLIENT_MAX_WINDOW_ANY接受任意窗口
typedef enum xwsdeflateflag { XWS_DEFLATE_SERVER_NO_CONTEXT = UINT32_C(0x00000001), XWS_DEFLATE_CLIENT_NO_CONTEXT = UINT32_C(0x00000002), XWS_DEFLATE_SERVER_MAX_WINDOW = UINT32_C(0x00000004), XWS_DEFLATE_CLIENT_MAX_WINDOW = UINT32_C(0x00000008), XWS_DEFLATE_CLIENT_MAX_WINDOW_ANY = UINT32_C(0x00000010)

xwsdeflateerror类型

permessage-deflate 错误码区分通用参数、重复项、窗口和协商响应。

值语义
XWS_DEFLATE_ERROR_ARGUMENT参数非法
XWS_DEFLATE_ERROR_EXTENSION失败
XWS_DEFLATE_ERROR_PARAMETER失败
XWS_DEFLATE_ERROR_DUPLICATE失败
XWS_DEFLATE_ERROR_WINDOW失败
XWS_DEFLATE_ERROR_RESPONSE失败
XWS_DEFLATE_ERROR_OUTPUT输出失败
XWS_DEFLATE_ERROR_CONFIG配置非法
XWS_DEFLATE_ERROR_STATE状态非法
XWS_DEFLATE_ERROR_DATA数据损坏
XWS_DEFLATE_ERROR_LIMIT超限
XWS_DEFLATE_ERROR_CODEC压缩流损坏
typedef enum xwsdeflateerror { XWS_DEFLATE_ERROR_ARGUMENT = 1, XWS_DEFLATE_ERROR_EXTENSION, XWS_DEFLATE_ERROR_PARAMETER, XWS_DEFLATE_ERROR_DUPLICATE, XWS_DEFLATE_ERROR_WINDOW, XWS_DEFLATE_ERROR_RESPONSE, XWS_DEFLATE_ERROR_OUTPUT, XWS_DEFLATE_ERROR_CONFIG, XWS_DEFLATE_ERROR_STATE, XWS_DEFLATE_ERROR_DATA, XWS_DEFLATE_ERROR_LIMIT, XWS_DEFLATE_ERROR_CODEC } xwsdeflateerror;

xwsdeflate类型

配置不持有资源;Flags 表达参数是否存在。 窗口参数未出现,或 offer 的 client 窗口省略值时,对应字段保持 15。

字段类型语义
Flagsuint32标志位
ServerMaxWindowBitsuint8ServerMaxWindowBits
ClientMaxWindowBitsuint8ClientMaxWindowBits
typedef struct xwsdeflate { uint32 Flags; uint8 ServerMaxWindowBits; uint8 ClientMaxWindowBits; } xwsdeflate;

xwsdeflatedirection类型

单向运行参数不持有资源,也不混淆客户端与服务端参数名。

字段类型语义
WindowBitsuint8WindowBits
NoContextTakeoverboolNoContextTakeover
typedef struct xwsdeflatedirection { uint8 WindowBits; bool NoContextTakeover; } xwsdeflatedirection;

xwsinflaterconfig类型

OutputLimit 是每条逻辑消息的解码后上限。 Retain 只在禁用上下文接管时决定是否保留已复位的算法对象。

字段类型语义
OutputLimituint64OutputLimit
WindowBitsuint8WindowBits
NoContextTakeoverboolNoContextTakeover
RetainboolRetain
typedef struct xwsinflaterconfig { uint64 OutputLimit; uint8 WindowBits; bool NoContextTakeover; bool Retain; } xwsinflaterconfig;

xwsdeflaterconfig类型

OutputLimit 是每条逻辑消息实际交付的线路负载上限;中间 Flush 尾部计入, 最终 End 尾部会被剥离。 Retain 只在禁用上下文接管时决定是否保留已复位的算法对象。

字段类型语义
OutputLimituint64OutputLimit
Levelint32级别
StrategyxdeflatestrategyStrategy
WindowBitsuint8WindowBits
NoContextTakeoverboolNoContextTakeover
RetainboolRetain
typedef struct xwsdeflaterconfig { uint64 OutputLimit; int32 Level; xdeflatestrategy Strategy; uint8 WindowBits; bool NoContextTakeover; bool Retain; } xwsdeflaterconfig;

xwsinflater类型

接收变换对象按需创建底层 Inflate,不缓存线路或解码后消息。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xwsinflater xwsinflater;

xwsdeflater类型

发送变换对象按需创建底层 Deflate,只额外暂存四字节同步尾部。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xwsdeflater xwsdeflater;

xwsoutputproc类型

WebSocket 压缩变换的输出视图只在同步回调期间有效。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef bool(*xwsoutputproc)(xbytesview Data, ptr pData)
高性能收发

xrtWsFrameConfigInit函数

初始化帧解析的默认配置与上限。

void xrtWsFrameConfigInit(xwsframeconfig* pConfig)

参数

参数方向约束说明
pConfig输出非空接收配置
返回值
返回含义失败时状态
无已初始化—
错误
  • 无 — 初始化不失败

范例已编译验证

frame · 帧配置

	xrtWsFrameConfigInit(&Config);

xrtWsFrameInit函数

把帧结构初始化为可复用状态。

void xrtWsFrameInit(xwsframe* pFrame)

参数

参数方向约束说明
pFrame输出非空接收帧
返回值
返回含义失败时状态
无已初始化—
错误
  • 无 — 初始化不失败

范例已编译验证

frame · 初始化帧

	xrtWsFrameInit(&Frame);

xrtWsFrameParse函数

从输入头部解析一个帧描述。

xwsframestatus xrtWsFrameParse(xbytesview Input, xwsframe* pFrame, const xwsframeconfig* pConfig, xwsframeerrorinfo* pError)

参数

参数方向约束说明
Input输入借用输入数据
pFrame输出非空接收帧
pConfig输入允许空帧配置
pError输出允许空接收错误信息
返回值
返回含义失败时状态
XWS_FRAME_READY已解析完整帧头—
XWS_FRAME_MORE输入不足不设错误
XWS_FRAME_ERROR帧非法或超限XERR_PROTOCOL / XERR_RANGE
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(xrt.ws 语义) — 帧或扩展语法非法
  • XERR_RANGE — 帧长超过配置上限

范例已编译验证

frame · 解析帧

	if ( xrtWsFrameParse(
		Input, &Parsed, &Config, NULL
	) != XWS_FRAME_READY ) {

xrtWsFrameWrite函数

把帧头按配置写入输出缓冲。

bool xrtWsFrameWrite(const xwsframe* pFrame, const xwsframeconfig* pConfig, void* pOutput, size_t iCapacity, size_t* pSize)

参数

参数方向约束说明
pFrame输入非空帧描述
pConfig输入允许空帧配置
pOutput输出非空输出缓冲
iCapacity输入—容量
pSize输出非空接收写出字节数
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_RANGE — 容量不足,不写半个结果
  • XERR_PROTOCOL(xrt.ws 语义) — 帧或扩展语法非法

范例已编译验证

frame · 写出帧

	if ( !xrtWsFrameWrite(
		&Frame, &Config, Head, sizeof(Head), &iHeadSize
	) ) {

xrtWsMask函数

按偏移连续应用四字节掩码。

bool xrtWsMask(void* pData, size_t iSize, const uint8 pMask[XWS_MASK_SIZE], uint64 iOffset)

参数

参数方向约束说明
pData输入/输出非空数据
iSize输入—字节数
XWS_MASK_SIZE输入—四字节掩码
iOffset输入—流内偏移
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

frame · 掩码异或

	if ( !xrtWsMask(Payload, sizeof(Payload), Mask, 0) ) {

xrtWsMessageConfigInit函数

初始化消息重组的默认配置。

void xrtWsMessageConfigInit(xwsmessageconfig* pConfig)

参数

参数方向约束说明
pConfig输出非空接收配置
返回值
返回含义失败时状态
无已初始化—
错误
  • 无 — 初始化不失败

范例已编译验证

extension_tour · 消息配置

	xrtWsMessageConfigInit(&MsgConfig);

xrtWsMessageConfigInitSafe函数

初始化更严格上限的安全消息配置。

void xrtWsMessageConfigInitSafe(xwsmessageconfig* pConfig)

参数

参数方向约束说明
pConfig输出非空接收配置
返回值
返回含义失败时状态
无已初始化—
错误
  • 无 — 初始化不失败

范例已编译验证

extension_tour · 安全消息配置

	xrtWsMessageConfigInitSafe(&MsgSafe);

xrtWsMessageInit函数

初始化消息重组状态。

bool xrtWsMessageInit(xwsmessagestate* pState, const xwsmessageconfig* pConfig)

参数

参数方向约束说明
pState输出非空接收状态
pConfig输入允许空消息配置
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

extension_tour · 初始化消息

	(void)xrtWsMessageInit(&MsgState, &MsgConfig);

xrtWsMessageFrameBegin函数

把帧计入消息重组状态并产出消息信息。

bool xrtWsMessageFrameBegin(xwsmessagestate* pState, const xwsframe* pFrame, xwsmessageinfo* pInfo, xwsmessageerrorinfo* pError)

参数

参数方向约束说明
pState输入/输出非空消息状态
pFrame输入非空帧描述
pInfo输出允许空接收消息信息
pError输出允许空接收错误信息
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL — 帧序列违反消息语义(如文本帧后接续帧)
  • XERR_RANGE — 消息超过配置上限

范例已编译验证

message · 开始帧

	if ( !xrtWsMessageFrameBegin(&State, &Frame, &Info, NULL) ||
		!xrtWsMessagePayload(
			&State,
			(xbytesview) { First, sizeof(First) },
			NULL
		) ||
		!xrtWsMessageFrameEnd(&State, NULL) ) {

xrtWsMessagePayload函数

把帧载荷字节数计入消息状态。

bool xrtWsMessagePayload(xwsmessagestate* pState, xbytesview Payload, xwsmessageerrorinfo* pError)

参数

参数方向约束说明
pState输入/输出非空消息状态
Payload输入借用帧载荷
pError输出允许空接收错误信息
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_RANGE — 消息超过配置上限

范例已编译验证

message · 计入载荷

		!xrtWsMessagePayload(
			&State,
			(xbytesview) { First, sizeof(First) },
			NULL
		) ||

xrtWsMessageFrameEnd函数

结束当前帧并推进重组状态。

bool xrtWsMessageFrameEnd(xwsmessagestate* pState, xwsmessageerrorinfo* pError)

参数

参数方向约束说明
pState输入/输出非空消息状态
pError输出允许空接收错误信息
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL — 分片未按 FIN 结束

范例已编译验证

message · 结束帧

		!xrtWsMessageFrameEnd(&State, NULL) ) {

xrtWsMessageReset函数

重置消息重组状态以便复用。

void xrtWsMessageReset(xwsmessagestate* pState)

参数

参数方向约束说明
pState输入/输出非空消息状态
返回值
返回含义失败时状态
无已重置—
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

extension_tour · 重置消息

	xrtWsMessageReset(&MsgState);  /* 复位后可复用于新连接 */
帧与消息契约

xrtWsKeyGenerate函数

生成 16 字节 base64 的 Sec-WebSocket-Key。

bool xrtWsKeyGenerate(char* sKey, size_t iCapacity)

参数

参数方向约束说明
sKey输出非空输出缓冲
iCapacity输入>= 25容量
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_RANGE — 容量不足,不写半个结果
  • XERR_IO — 系统安全随机源失败

范例已编译验证

upgrade · 生成密钥

	if ( !xrtWsKeyGenerate(Key, sizeof(Key)) ||
		!xrtWsUpgradeRequestFields(
			XRT_STR_LITERAL("example.test"),
			(xstrview) { Key, XWS_KEY_SIZE },
			XRT_STR_LITERAL("chat"),
			(xstrview) { 0 },
			Fields,
			sizeof(Fields) / sizeof(Fields[0]),
			&iFieldCount
		) || !xrtHttp1RequestWrite(
			XRT_STR_LITERAL("GET"),

xrtWsKeyValid函数

校验 Sec-WebSocket-Key 形态。

bool xrtWsKeyValid(xstrview Key)

参数

参数方向约束说明
Key输入借用密钥文本
返回值
返回含义失败时状态
true是合法—
false不是合法—
错误
  • 无 — 纯校验,不设置错误

范例已编译验证

extension_tour · 校验密钥

	if ( !xrtWsKeyValid(SV(EXAMPLE_KEY)) ||
		xrtWsKeyValid(SV("short")) ||
		!xrtWsAcceptValid(SV(EXAMPLE_KEY), SV(EXAMPLE_ACCEPT)) ||
		xrtWsAcceptValid(SV(EXAMPLE_KEY), SV("wrong-wrong-wrong-wrong")) ||
		!xrtWsCloseCodeValid(1000u) ||
		!xrtWsCloseCodeValid(3000u) ||
		xrtWsCloseCodeValid(999u) ||
		xrtWsCloseCodeValid(1005u) ) {

xrtWsAccept函数

由密钥计算 Sec-WebSocket-Accept。

bool xrtWsAccept(xstrview Key, char* sAccept, size_t iCapacity)

参数

参数方向约束说明
Key输入借用密钥文本
sAccept输出非空输出缓冲
iCapacity输入>= 29容量
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_RANGE — 容量不足,不写半个结果

范例已编译验证

handshake · 计算 Accept

	if ( !xrtWsAccept(
		XRT_STR_LITERAL("dGhlIHNhbXBsZSBub25jZQ=="),
		Accept,
		sizeof(Accept)
	) ) {

xrtWsAcceptValid函数

校验服务端 Accept 值与密钥匹配。

bool xrtWsAcceptValid(xstrview Key, xstrview Accept)

参数

参数方向约束说明
Key输入借用密钥文本
Accept输入借用Accept 值
返回值
返回含义失败时状态
true是匹配—
false不是匹配—
错误
  • 不匹配返回 false 且不设置错误

范例已编译验证

extension_tour · 校验 Accept

		!xrtWsAcceptValid(SV(EXAMPLE_KEY), SV(EXAMPLE_ACCEPT)) ||

xrtWsCloseCodeValid函数

判断关闭码是否在协议允许范围内。

bool xrtWsCloseCodeValid(uint16 iCode)

参数

参数方向约束说明
iCode输入—关闭码
返回值
返回含义失败时状态
true是合法—
false不是合法—
错误
  • 无 — 纯校验,不设置错误

范例已编译验证

extension_tour · 校验关闭码

		!xrtWsCloseCodeValid(1000u) ||

xrtWsCloseParse函数

解析关闭帧载荷为代码与原因。

bool xrtWsCloseParse(xbytesview Payload, xwsclose* pClose)

参数

参数方向约束说明
Payload输入借用关闭载荷
pClose输出非空接收关闭描述
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL — 载荷长度为 1 或代码/原因非法

范例已编译验证

close · 解析关闭帧

	if ( !xrtWsCloseParse(Input, &Close) ) {

xrtWsCloseWrite函数

把代码与原因写为关闭帧载荷。

bool xrtWsCloseWrite(uint16 iCode, xstrview Reason, void* pOutput, size_t iCapacity, size_t* pSize)

参数

参数方向约束说明
iCode输入—关闭码
Reason输入借用原因文本
pOutput输出非空输出缓冲
iCapacity输入—容量
pSize输出非空接收字节数
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_RANGE — 容量不足,不写半个结果
  • XERR_PROTOCOL — 关闭码不允许携带原因

范例已编译验证

close · 写出关闭帧

	if ( !xrtWsCloseWrite(
		XWS_CLOSE_NORMAL,
		XRT_STR_LITERAL("shutdown"),
		Payload,
		sizeof(Payload),
		&iSize
	) ) {

xrtWsProtocolNext函数

遍历逗号分隔的子协议列表。

xhttpnext xrtWsProtocolNext(xstrview Protocols, size_t* pOffset, xstrview* pProtocol)

参数

参数方向约束说明
Protocols输入借用列表文本
pOffset输入/输出非空偏移游标
pProtocol输出非空接收子协议视图
返回值
返回含义失败时状态
XHTTP_NEXT_ITEM已产出一项—
XHTTP_NEXT_END遍历结束—
XHTTP_NEXT_ERROR失败—
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(xrt.ws 语义) — 帧或扩展语法非法

范例已编译验证

extension_tour · 下一子协议

	while ( xrtWsProtocolNext(SV("chat, superchat"), &iOffset,
			&Protocol) == XHTTP_NEXT_ITEM ) {

xrtWsProtocolSelect函数

在客户端与服务器列表交集中选择子协议。

bool xrtWsProtocolSelect(xstrview ClientProtocols, xstrview ServerProtocols, xstrview* pSelected)

参数

参数方向约束说明
ClientProtocols输入借用客户端列表
ServerProtocols输入借用服务器列表
pSelected输出非空接收选中视图
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • 未命中时返回 false 且不设置错误

范例已编译验证

handshake · 选择子协议

	if ( !xrtWsProtocolSelect(
		XRT_STR_LITERAL("chat, superchat"),
		XRT_STR_LITERAL("superchat, binary"),
		&Selected
	) ) {

xrtWsProtocolsHas函数

判断列表是否包含指定子协议。

bool xrtWsProtocolsHas(xstrview Protocols, xstrview Protocol)

参数

参数方向约束说明
Protocols输入借用列表文本
Protocol输入借用子协议
返回值
返回含义失败时状态
true是包含—
false不是包含—
错误
  • 无 — 纯查询,不设置错误

范例已编译验证

extension_tour · 包含子协议

		!xrtWsProtocolsHas(SV("chat, superchat"), SV("superchat")) ||

xrtWsProtocolsValid函数

校验列表中每个子协议形态合法。

bool xrtWsProtocolsValid(xstrview Protocols)

参数

参数方向约束说明
Protocols输入借用列表文本
返回值
返回含义失败时状态
true是全部合法—
false不是全部合法—
错误
  • 无 — 纯校验,不设置错误

范例已编译验证

extension_tour · 校验子协议列表

	if ( !xrtWsProtocolsValid(SV("chat, superchat")) ||
		xrtWsProtocolsValid(SV("chat,,x")) ||  /* 空项非法 */
		!xrtWsProtocolsHas(SV("chat, superchat"), SV("superchat")) ||
		xrtWsProtocolsHas(SV("chat"), SV("super")) ) {

xrtWsExtensionCount函数

统计扩展列表中的扩展个数。

bool xrtWsExtensionCount(xstrview Extensions, size_t* pCount)

参数

参数方向约束说明
Extensions输入借用扩展列表文本
pCount输出非空接收数量
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(xrt.ws 语义) — 帧或扩展语法非法

范例已编译验证

extension_tour · 扩展数量

	if ( !xrtWsExtensionCount(SV("permessage-deflate; client_max_window_bits"),
			&iSize) ||
		(iSize != 1u) ||
		!xrtWsExtensionWrite(SV("permessage-deflate"),
			SV("client_max_window_bits=12"),
			ExtText, sizeof(ExtText), &iSize) ||
		(iSize == 0u) ||
		(iSize >= sizeof(ExtText)) ) {

xrtWsExtensionNext函数

遍历扩展列表中的下一个扩展。

xhttpnext xrtWsExtensionNext(xstrview Extensions, size_t* pOffset, xwsextension* pExtension)

参数

参数方向约束说明
Extensions输入借用扩展列表文本
pOffset输入/输出非空偏移游标
pExtension输出非空接收扩展
返回值
返回含义失败时状态
XHTTP_NEXT_ITEM已产出一项—
XHTTP_NEXT_END遍历结束—
XHTTP_NEXT_ERROR失败—
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(xrt.ws 语义) — 帧或扩展语法非法

范例已编译验证

deflate · 下一扩展

	if ( xrtWsExtensionNext(
		Text,
		&iOffset,
		&Extension
	) != XHTTP_NEXT_ITEM ) {

xrtWsExtensionParamNext函数

遍历扩展的下一个参数。

xhttpnext xrtWsExtensionParamNext(const xwsextension* pExtension, size_t* pOffset, xhttpparam* pParam)

参数

参数方向约束说明
pExtension输入非空扩展
pOffset输入/输出非空偏移游标
pParam输出非空接收参数
返回值
返回含义失败时状态
XHTTP_NEXT_ITEM已产出一项—
XHTTP_NEXT_END遍历结束—
XHTTP_NEXT_ERROR失败—
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(xrt.ws 语义) — 帧或扩展语法非法

范例已编译验证

extension · 下一扩展参数

		while ( xrtWsExtensionParamNext(
			&Extension,
			&iParam,
			&Param
		) == XHTTP_NEXT_ITEM ) {

xrtWsExtensionWrite函数

把扩展名与参数写为列表片段。

bool xrtWsExtensionWrite(xstrview Name, xstrview Parameters, void* pOutput, size_t iCapacity, size_t* pSize)

参数

参数方向约束说明
Name输入借用扩展名
Parameters输入借用参数文本
pOutput输出非空输出缓冲
iCapacity输入—容量
pSize输出非空接收字节数
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_RANGE — 容量不足,不写半个结果
  • XERR_PROTOCOL(xrt.ws 语义) — 帧或扩展语法非法

范例已编译验证

extension_tour · 写出扩展

		!xrtWsExtensionWrite(SV("permessage-deflate"),
			SV("client_max_window_bits=12"),
			ExtText, sizeof(ExtText), &iSize) ||
permessage-deflate

xrtWsDeflateInit函数

初始化 permessage-deflate 参数为默认提议。

void xrtWsDeflateInit(xwsdeflate* pConfig)

参数

参数方向约束说明
pConfig输出非空接收参数
返回值
返回含义失败时状态
无已初始化—
错误
  • 无 — 初始化不失败

范例已编译验证

extension_tour · 初始化协商

	(void)xrtWsDeflateInit(&Offer);

xrtWsDeflateIs函数

判断扩展是否为 permessage-deflate。

bool xrtWsDeflateIs(const xwsextension* pExtension)

参数

参数方向约束说明
pExtension输入非空扩展
返回值
返回含义失败时状态
true是否—
false非是否—
错误
  • 无 — 纯判断,不设置错误

范例已编译验证

extension_tour · 识别扩展

	if ( !xrtWsDeflateIs(&Extension) ) {

xrtWsDeflateOfferParse函数

解析客户端提议参数。

bool xrtWsDeflateOfferParse(const xwsextension* pExtension, xwsdeflate* pOffer)

参数

参数方向约束说明
pExtension输入非空扩展
pOffer输出非空接收提议
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(xrt.ws 语义) — 帧或扩展语法非法

范例已编译验证

deflate · 解析提议

	if ( !xrtWsDeflateOfferParse(
		&Extension,
		&Offer
	) || !xrtWsDeflateAccept(
		&Offer,
		&Response
	) || !xrtWsDeflateResponseWrite(
		&Response,
		Output,
		XWS_DEFLATE_MAX_SIZE,
		&iSize

xrtWsDeflateOfferWrite函数

把提议参数写为扩展列表片段。

bool xrtWsDeflateOfferWrite(const xwsdeflate* pOffer, void* pOutput, size_t iCapacity, size_t* pSize)

参数

参数方向约束说明
pOffer输入非空提议
pOutput输出非空输出缓冲
iCapacity输入—容量
pSize输出非空接收字节数
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_RANGE — 容量不足,不写半个结果

范例已编译验证

extension_tour · 写出提议

	if ( !xrtWsDeflateOfferWrite(&Offer, NULL, 0u, &iSize) ||
		(iSize >= sizeof(OfferText)) ||
		!xrtWsDeflateOfferWrite(&Offer, OfferText,
			sizeof(OfferText), &iSize) ) {

xrtWsDeflateResponseParse函数

解析服务端响应参数。

bool xrtWsDeflateResponseParse(const xwsextension* pExtension, xwsdeflate* pResponse)

参数

参数方向约束说明
pExtension输入非空扩展
pResponse输出非空接收响应
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(xrt.ws 语义) — 帧或扩展语法非法

范例已编译验证

extension_tour · 解析响应

		if ( !xrtWsDeflateResponseParse(&RespExt, &Parsed) ||
			(Parsed.ServerMaxWindowBits != 10u) ) {

xrtWsDeflateResponseWrite函数

把响应参数写为扩展列表片段。

bool xrtWsDeflateResponseWrite(const xwsdeflate* pResponse, void* pOutput, size_t iCapacity, size_t* pSize)

参数

参数方向约束说明
pResponse输入非空响应
pOutput输出非空输出缓冲
iCapacity输入—容量
pSize输出非空接收字节数
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_RANGE — 容量不足,不写半个结果

范例已编译验证

deflate · 写出响应

	) || !xrtWsDeflateResponseWrite(

xrtWsDeflateResponseCheck函数

校验服务端响应与客户端提议兼容。

bool xrtWsDeflateResponseCheck(const xwsdeflate* pOffer, const xwsdeflate* pResponse)

参数

参数方向约束说明
pOffer输入非空提议
pResponse输入非空响应
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL — 响应与提议不兼容

范例已编译验证

extension_tour · 校验响应

	if ( !xrtWsDeflateResponseCheck(&Offer, &Response) ) {

xrtWsDeflateAccept函数

按提议生成兼容的服务端响应参数。

bool xrtWsDeflateAccept(const xwsdeflate* pOffer, xwsdeflate* pResponse)

参数

参数方向约束说明
pOffer输入非空提议
pResponse输出非空接收响应
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_UNSUPPORTED — 提议参数无法满足

范例已编译验证

deflate · 生成响应

	) || !xrtWsDeflateAccept(

xrtWsDeflateDirection函数

按角色与方向推导压缩器/解压器配置参数。

bool xrtWsDeflateDirection(const xwsdeflate* pResponse, xwsrole Role, bool bSend, xwsdeflatedirection* pDirection)

参数

参数方向约束说明
pResponse输入非空协商响应
Role输入—本端角色
bSend输入—是否发送方向
pDirection输出非空接收方向参数
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

extension_tour · 方向参数

	if ( !xrtWsDeflateDirection(&Response, XWS_ROLE_SERVER, true,
			&SendDir) ||
		!xrtWsDeflateDirection(&Response, XWS_ROLE_SERVER, false,
			&RecvDir) ||
		(SendDir.WindowBits != 10u) ||
		(RecvDir.WindowBits != 15u) ) {

xrtWsDeflaterConfigInit函数

初始化压缩器默认配置。

void xrtWsDeflaterConfigInit(xwsdeflaterconfig* pConfig)

参数

参数方向约束说明
pConfig输出非空接收配置
返回值
返回含义失败时状态
无已初始化—
错误
  • 无 — 初始化不失败

范例已编译验证

deflater · 压缩器配置

	xrtWsDeflaterConfigInit(&Config);

xrtWsDeflaterConfigApply函数

把协商方向参数应用到配置。

bool xrtWsDeflaterConfigApply(xwsdeflaterconfig* pConfig, const xwsdeflatedirection* pDirection)

参数

参数方向约束说明
pConfig输出非空目标配置
pDirection输入非空方向参数
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(xrt.ws 语义) — 帧或扩展语法非法

范例已编译验证

extension_tour · 应用方向参数

		!xrtWsDeflaterConfigApply(&DeflaterConfig, &SendDir) ) {

xrtWsDeflaterCreate函数

创建 permessage-deflate 压缩器。

xwsdeflater* xrtWsDeflaterCreate(const xwsdeflaterconfig* pConfig)

参数

参数方向约束说明
pConfig输入允许空配置,空 = 默认
返回值
返回含义失败时状态
非空压缩器—
NULL创建失败XERR_ARGUMENT / XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY — 分配失败
  • XERR_UNSUPPORTED — 压缩后端不可用

范例已编译验证

deflater · 创建压缩器

	pDeflater = xrtWsDeflaterCreate(&Config);

xrtWsDeflaterDestroy函数

销毁压缩器及其上下文。

void xrtWsDeflaterDestroy(xwsdeflater* pDeflater)

参数

参数方向约束说明
pDeflater输入允许空空 = 空操作
返回值
返回含义失败时状态
无已销毁—
错误
  • 无 — 释放不失败

范例已编译验证

deflater · 销毁压缩器

		xrtWsDeflaterDestroy(pDeflater);

xrtWsDeflaterReset函数

按新配置重置压缩器上下文。

bool xrtWsDeflaterReset(xwsdeflater* pDeflater, const xwsdeflaterconfig* pConfig)

参数

参数方向约束说明
pDeflater输入/输出非空目标压缩器
pConfig输入允许空新配置,空 = 保持
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

extension_tour · 重置压缩器

		!xrtWsDeflaterReset(pDeflater, &DeflaterConfig) ) {

xrtWsDeflaterBegin函数

开始一条(可压缩)消息。

bool xrtWsDeflaterBegin(xwsdeflater* pDeflater, bool bCompressed)

参数

参数方向约束说明
pDeflater输入/输出非空目标压缩器
bCompressed输入—本条是否压缩
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

deflater · 开始消息

		!xrtWsDeflaterBegin(pDeflater, true) ||

xrtWsDeflaterWrite函数

把消息数据写入压缩器。

bool xrtWsDeflaterWrite(xwsdeflater* pDeflater, xbytesview Input, xwsoutputproc pOutput, ptr pData)

参数

参数方向约束说明
pDeflater输入/输出非空目标压缩器
Input输入借用消息数据
pOutput输入非空输出回调
pData输入任意值回调数据
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_STATE — 未 Begin
  • XERR_MEMORY — 内部缓冲扩容失败

范例已编译验证

deflater · 写入数据

		!xrtWsDeflaterWrite(
			pDeflater,
			XRT_BYTES_LITERAL("Hello permessage-deflate"),
			onCompressed,
			&iSize
		) ||

xrtWsDeflaterFlush函数

冲刷当前块并同步可用输出。

bool xrtWsDeflaterFlush(xwsdeflater* pDeflater, xwsoutputproc pOutput, ptr pData)

参数

参数方向约束说明
pDeflater输入/输出非空目标压缩器
pOutput输入非空输出回调
pData输入任意值回调数据
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_STATE — 未 Begin

范例已编译验证

extension_tour · 冲刷

		!xrtWsDeflaterFlush(pDeflater, exampleCollect, &Sink) ||

xrtWsDeflaterEnd函数

结束消息并写出尾块。

bool xrtWsDeflaterEnd(xwsdeflater* pDeflater, xwsoutputproc pOutput, ptr pData)

参数

参数方向约束说明
pDeflater输入/输出非空目标压缩器
pOutput输入非空输出回调
pData输入任意值回调数据
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_STATE — 未 Begin

范例已编译验证

deflater · 结束消息

		!xrtWsDeflaterEnd(
			pDeflater,
			onCompressed,
			&iSize
		) ) {

xrtWsDeflaterAbort函数

丢弃未完成消息的压缩状态。

bool xrtWsDeflaterAbort(xwsdeflater* pDeflater)

参数

参数方向约束说明
pDeflater输入/输出非空目标压缩器
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

extension_tour · 中止消息

	if ( !xrtWsDeflaterAbort(pDeflater) ) {

xrtWsDeflaterSize函数

返回压缩器累计输出字节数。

uint64 xrtWsDeflaterSize(const xwsdeflater* pDeflater)

参数

参数方向约束说明
pDeflater输入非空目标压缩器
返回值
返回含义失败时状态
>= 0累计输出字节—
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

extension_tour · 累计输出

	if ( (xrtWsDeflaterSize(pDeflater) == 0u) ||
		(xrtWsDeflaterSize(pDeflater) != (uint64)Sink.Size) ) {

xrtWsDeflaterBound函数

估算输入尺寸的压缩输出上界。

bool xrtWsDeflaterBound(size_t iInputSize, size_t* pOutputSize)

参数

参数方向约束说明
iInputSize输入—输入字节数
pOutputSize输出非空接收上界
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

extension_tour · 输出上界

		!xrtWsDeflaterBound(64u, &iBound) ||

xrtWsInflaterConfigInit函数

初始化解压器默认配置。

void xrtWsInflaterConfigInit(xwsinflaterconfig* pConfig)

参数

参数方向约束说明
pConfig输出非空接收配置
返回值
返回含义失败时状态
无已初始化—
错误
  • 无 — 初始化不失败

范例已编译验证

extension_tour · 解压器配置

	(void)xrtWsInflaterConfigInit(&InflaterConfig);

xrtWsInflaterConfigApply函数

把协商方向参数应用到配置。

bool xrtWsInflaterConfigApply(xwsinflaterconfig* pConfig, const xwsdeflatedirection* pDirection)

参数

参数方向约束说明
pConfig输出非空目标配置
pDirection输入非空方向参数
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(xrt.ws 语义) — 帧或扩展语法非法

范例已编译验证

extension_tour · 应用方向参数

	if ( !xrtWsInflaterConfigApply(&InflaterConfig, &RecvDir) ||
		!xrtWsDeflaterConfigApply(&DeflaterConfig, &SendDir) ) {

xrtWsInflaterCreate函数

创建 permessage-deflate 解压器。

xwsinflater* xrtWsInflaterCreate(const xwsinflaterconfig* pConfig)

参数

参数方向约束说明
pConfig输入允许空配置,空 = 默认
返回值
返回含义失败时状态
非空解压器—
NULL创建失败XERR_ARGUMENT / XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY — 分配失败
  • XERR_UNSUPPORTED — 解压后端不可用

范例已编译验证

extension_tour · 创建解压器

	pInflater = xrtWsInflaterCreate(&InflaterConfig);

xrtWsInflaterDestroy函数

销毁解压器及其上下文。

void xrtWsInflaterDestroy(xwsinflater* pInflater)

参数

参数方向约束说明
pInflater输入允许空空 = 空操作
返回值
返回含义失败时状态
无已销毁—
错误
  • 无 — 释放不失败

范例已编译验证

extension_tour · 销毁解压器

	xrtWsInflaterDestroy(pInflater);

xrtWsInflaterReset函数

按新配置重置解压器上下文。

bool xrtWsInflaterReset(xwsinflater* pInflater, const xwsinflaterconfig* pConfig)

参数

参数方向约束说明
pInflater输入/输出非空目标解压器
pConfig输入允许空新配置,空 = 保持
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

extension_tour · 重置解压器

	if ( !xrtWsInflaterReset(pInflater, &InflaterConfig) ||
		!xrtWsDeflaterReset(pDeflater, &DeflaterConfig) ) {

xrtWsInflaterBegin函数

开始一条(可能压缩)消息。

bool xrtWsInflaterBegin(xwsinflater* pInflater, bool bCompressed)

参数

参数方向约束说明
pInflater输入/输出非空目标解压器
bCompressed输入—本条是否压缩
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

inflater · 开始消息

		!xrtWsInflaterBegin(pInflater, true) ||

xrtWsInflaterWrite函数

把压缩数据写入解压器。

bool xrtWsInflaterWrite(xwsinflater* pInflater, xbytesview Input, xwsoutputproc pOutput, ptr pData)

参数

参数方向约束说明
pInflater输入/输出非空目标解压器
Input输入借用压缩数据
pOutput输入非空输出回调
pData输入任意值回调数据
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL — 压缩流损坏
  • XERR_RANGE — 解压输出超过配置上限
  • XERR_STATE — 未 Begin

范例已编译验证

inflater · 写入数据

		!xrtWsInflaterWrite(
			pInflater,
			(xbytesview){ Encoded, sizeof(Encoded) },
			onText,
			NULL
		) ||

xrtWsInflaterEnd函数

结束消息并校验尾块。

bool xrtWsInflaterEnd(xwsinflater* pInflater, xwsoutputproc pOutput, ptr pData)

参数

参数方向约束说明
pInflater输入/输出非空目标解压器
pOutput输入非空输出回调
pData输入任意值回调数据
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL — 尾块不符合 permessage-deflate 约定
  • XERR_STATE — 未 Begin

范例已编译验证

inflater · 结束消息

		!xrtWsInflaterEnd(pInflater, onText, NULL) ) {

xrtWsInflaterSize函数

返回解压器累计输出字节数。

uint64 xrtWsInflaterSize(const xwsinflater* pInflater)

参数

参数方向约束说明
pInflater输入非空目标解压器
返回值
返回含义失败时状态
>= 0累计输出字节—
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

extension_tour · 累计输出

	if ( xrtWsInflaterSize(pInflater) != 0u ) {

常量索引常量

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

常量说明
XWS_ACCEPT_CAPACITY见头文件注释
XWS_ACCEPT_SIZE见头文件注释
XWS_CLOSE_ABNORMAL见头文件注释
XWS_CLOSE_BAD_GATEWAY见头文件注释
XWS_CLOSE_ERROR_ARGUMENT见头文件注释
XWS_CLOSE_ERROR_CODE见头文件注释
XWS_CLOSE_ERROR_OUTPUT见头文件注释
XWS_CLOSE_ERROR_SIZE见头文件注释
XWS_CLOSE_ERROR_UTF8见头文件注释
XWS_CLOSE_EXTENSION_REQUIRED见头文件注释
XWS_CLOSE_GOING_AWAY见头文件注释
XWS_CLOSE_INTERNAL见头文件注释
XWS_CLOSE_INVALID_DATA见头文件注释
XWS_CLOSE_NORMAL见头文件注释
XWS_CLOSE_NO_STATUS见头文件注释
XWS_CLOSE_PAYLOAD_MAX见头文件注释
XWS_CLOSE_POLICY见头文件注释
XWS_CLOSE_PROTOCOL见头文件注释
XWS_CLOSE_REASON_MAX见头文件注释
XWS_CLOSE_RESTART见头文件注释
XWS_CLOSE_TLS见头文件注释
XWS_CLOSE_TOO_BIG见头文件注释
XWS_CLOSE_TRY_AGAIN见头文件注释
XWS_CLOSE_UNSUPPORTED见头文件注释
XWS_DEFLATE_CLIENT_MAX_WINDOW见头文件注释
XWS_DEFLATE_CLIENT_MAX_WINDOW_ANY见头文件注释
XWS_DEFLATE_CLIENT_NO_CONTEXT见头文件注释
XWS_DEFLATE_ERROR_ARGUMENT见头文件注释
XWS_DEFLATE_ERROR_CODEC见头文件注释
XWS_DEFLATE_ERROR_CONFIG见头文件注释
XWS_DEFLATE_ERROR_DATA见头文件注释
XWS_DEFLATE_ERROR_DUPLICATE见头文件注释
XWS_DEFLATE_ERROR_EXTENSION见头文件注释
XWS_DEFLATE_ERROR_LIMIT见头文件注释
XWS_DEFLATE_ERROR_OUTPUT见头文件注释
XWS_DEFLATE_ERROR_PARAMETER见头文件注释
XWS_DEFLATE_ERROR_RESPONSE见头文件注释
XWS_DEFLATE_ERROR_STATE见头文件注释
XWS_DEFLATE_ERROR_WINDOW见头文件注释
XWS_DEFLATE_MAX_SIZE见头文件注释
XWS_DEFLATE_NAME见头文件注释
XWS_DEFLATE_SERVER_MAX_WINDOW见头文件注释
XWS_DEFLATE_SERVER_NO_CONTEXT见头文件注释
XWS_DEFLATE_WINDOW_MAX见头文件注释
XWS_DEFLATE_WINDOW_MIN见头文件注释
XWS_FRAME_ERROR见头文件注释
XWS_FRAME_ERROR_ARGUMENT见头文件注释
XWS_FRAME_ERROR_CLOSE见头文件注释
XWS_FRAME_ERROR_CONFIG见头文件注释
XWS_FRAME_ERROR_CONTROL见头文件注释
XWS_FRAME_ERROR_LENGTH见头文件注释
XWS_FRAME_ERROR_MASK见头文件注释
XWS_FRAME_ERROR_OPCODE见头文件注释
XWS_FRAME_ERROR_OUTPUT见头文件注释
XWS_FRAME_ERROR_RSV见头文件注释
XWS_FRAME_FIN见头文件注释
XWS_FRAME_HEAD_MAX见头文件注释
XWS_FRAME_MASKED见头文件注释
XWS_FRAME_MORE见头文件注释
XWS_FRAME_PAYLOAD_MAX见头文件注释
XWS_FRAME_READY见头文件注释
XWS_FRAME_RSV1见头文件注释
XWS_FRAME_RSV2见头文件注释
XWS_FRAME_RSV3见头文件注释
XWS_HANDSHAKE_ERROR_ACCEPT见头文件注释
XWS_HANDSHAKE_ERROR_ARGUMENT见头文件注释
XWS_HANDSHAKE_ERROR_BODY见头文件注释
XWS_HANDSHAKE_ERROR_CONNECTION见头文件注释
XWS_HANDSHAKE_ERROR_EXTENSION见头文件注释
XWS_HANDSHAKE_ERROR_FIELD见头文件注释
XWS_HANDSHAKE_ERROR_HOST见头文件注释
XWS_HANDSHAKE_ERROR_KEY见头文件注释
XWS_HANDSHAKE_ERROR_METHOD见头文件注释
XWS_HANDSHAKE_ERROR_OUTPUT见头文件注释
XWS_HANDSHAKE_ERROR_PROTOCOL见头文件注释
XWS_HANDSHAKE_ERROR_RANDOM见头文件注释
XWS_HANDSHAKE_ERROR_STATUS见头文件注释
XWS_HANDSHAKE_ERROR_UPGRADE见头文件注释
XWS_HANDSHAKE_ERROR_VERSION见头文件注释
XWS_INFLATE_OUTPUT_DEFAULT见头文件注释
XWS_KEY_BYTES见头文件注释
XWS_KEY_CAPACITY见头文件注释
XWS_KEY_SIZE见头文件注释
XWS_MASK_ANY见头文件注释
XWS_MASK_FORBIDDEN见头文件注释
XWS_MASK_REQUIRED见头文件注释
XWS_MASK_SIZE见头文件注释
XWS_MESSAGE_BEGIN见头文件注释
XWS_MESSAGE_COMPRESSED见头文件注释
XWS_MESSAGE_CONTROL见头文件注释
XWS_MESSAGE_END见头文件注释
XWS_MESSAGE_ERROR_ARGUMENT见头文件注释
XWS_MESSAGE_ERROR_CLOSE见头文件注释
XWS_MESSAGE_ERROR_CONFIG见头文件注释
XWS_MESSAGE_ERROR_FRAGMENT见头文件注释
XWS_MESSAGE_ERROR_OPCODE见头文件注释
XWS_MESSAGE_ERROR_PAYLOAD见头文件注释
XWS_MESSAGE_ERROR_RSV见头文件注释
XWS_MESSAGE_ERROR_SIZE见头文件注释
XWS_MESSAGE_ERROR_STATE见头文件注释
XWS_MESSAGE_ERROR_UTF8见头文件注释
XWS_MESSAGE_EXTENDED见头文件注释
XWS_MESSAGE_SIZE_SAFE_DEFAULT见头文件注释
XWS_OPCODES_STANDARD见头文件注释
XWS_OPCODE_BINARY见头文件注释
XWS_OPCODE_CLOSE见头文件注释
XWS_OPCODE_CONTINUATION见头文件注释
XWS_OPCODE_PING见头文件注释
XWS_OPCODE_PONG见头文件注释
XWS_OPCODE_TEXT见头文件注释
XWS_ROLE_CLIENT见头文件注释
XWS_ROLE_SERVER见头文件注释
XWS_VERSION见头文件注释