http.sse
Server-Sent Events(P4-C):事件流写面 + 客户端读侧 形态(与 http/parse.ct 头注同源,皆发射面已证形态): ① 零 use 纯模块:不 import std.net(加载器栈式查环把跨模块菱形 use 误判 环 —— divergences (g) E5020;本波实测加码:同父多子共享任一叶子同样 E5020/同名合并 E5030 ⇒ http 的 use 图必须是严格互斥树,见 client.ct 头注)。IO 粘合(事件串经 net 写道落 socket)由消费方一行 client_write_str 承担;本文件只出【串面写 + 增量读状态机】。 ② 写面 = sse_event_str:WHATWG HTML §server-sent-events 序列化 —— id:(有则)/ retry:(有则)/ event:(有则;空 = 默认 "message")/ data: 每逻辑行一条(多行 data 按 '\n' 拆,逐行剥尾 '\r')/ 空行派发。 字段顺序对解析方不敏感(spec 按行处理);取 id 前置惯例。 ③ 读面 = sse_step 可重入状态机(chunk_step 契约同款):src[pos..n) 进、 SseRet 出;rc = 1 派发(name/data/id 三槽;name 空 → "message";data 已去尾 LF)/ 0 需要更多(consumed = 未竟行起点距 pos 位移 —— 已落袋 行段照计,整行回卷重扫,无半行状态)/ -1 协议错(err 槽:1 非法字节、 2 行超限)。逐行处理(与 WHATWG 处理模型一致):空行派发但 data 空则 不派发(spec:空 data 缓冲 = 无事件);注释行(':' 起头)忽略; event/data/id/retry 之外字段名忽略;值域仅一冒号后单空格剥除; retry 记录不消费(v1:重连定时客户端侧无消费面,登记)。 ④ 字节道进(/I64[] 每字节一条 lane);Str 出(事件文本域,printable ASCII 32..126 + HTAB;C8 约束下经本模块 95 字表切片构建,表含 { } 转义 —— JSON 载荷常见面)。非 ASCII 载荷本波不收(登记;text/event- stream 为 UTF-8 文本域,宽字节面随 Str 构建面放宽同波)。 ⑤ 压缩互斥:permessage/content 编码不与此面交互(P4 登记面);无闭包、 无 Drop 局部、无方法调用,while 体仅标量局部((f)/(g) 纪律)。
pub struct
struct SseSt
状态:name/data/id 跨调用携带(data 以 '\n' 逐行累积,派发时去尾);
phase 恒 0(无跨行半扫状态 —— 回卷契约不需要相)。
| Field | Type |
|---|---|
name |
Str |
data |
Str |
id |
Str |
struct SseRet
| Field | Type |
|---|---|
rc |
I64 |
err |
I64 |
consumed |
I64 |
name |
Str |
data |
Str |
id |
Str |
st |
SseSt |
pub fn
| Signature | Returns | Description |
|---|---|---|
sse_event_str(event: Str, data: Str, id: Str, retry: Str) |
Str |
单行 data 拆行 + 剥尾 CR 后拼 data: 行序列;末尾派发空行。 id / retry / event 空串 = 省略该行(event 省略 = 接收方默认 "message")。 |
sse_st_new() |
SseSt |
— |
sst_name(st: SseSt) |
Str |
公开 getter((h) 缺口绕行:成员访问不出本模块) |
sst_data(st: SseSt) |
Str |
— |
sst_id(st: SseSt) |
Str |
— |
sret_rc(r: SseRet) |
I64 |
— |
sret_err(r: SseRet) |
I64 |
— |
sret_consumed(r: SseRet) |
I64 |
— |
sret_name(r: SseRet) |
Str |
— |
sret_data(r: SseRet) |
Str |
— |
sret_id(r: SseRet) |
Str |
— |
sret_st(r: SseRet) |
SseSt |
— |
sse_step(src: &[I64], n: I64, pos: I64, st: SseSt) |
SseRet |
一步:自 pos 扫描;完整行即时处理(行内循环),空行派发(data 非空)或 吞弃;输入尽则 rc=0(回卷至未竟行起点)。行值段出 Str;域外字节 → -1。 |