Skip to content

fix(http3): 服务端 accept() 之后要把 on_open 交给应用 - #64

Closed
Antruly wants to merge 1 commit into
masterfrom
fix/wt-server-on-open
Closed

Antruly wants to merge 1 commit into
masterfrom
fix/wt-server-on-open

Conversation

@Antruly

@Antruly Antruly commented Oct 28, 2026

Copy link
Copy Markdown
Owner

问题

uvcpp_h3_wt_session::accept() 发完 200 就返回:会话对象建出来了,但服务端的
on_open 永远不触发。

客户端那条路(on_connect_response())在收到 2xx 后既置位又回调,服务端漏了
这一句。应用没有别的办法拿到会话——accept() 的返回值要等它返回之后才有——
于是:

  • 服务端 open_bidi_stream() 拿不到流(在 on_open 里开流是唯一自然的位置);
  • 应用无法把会话接上自己的传输,datagram 的分发落在没人接的回调上。

修法

accept() 在装好会话流落点之后,把 on_open 调出去一次(先拷出回调再调,
与会话里其它回调同一条纪律)。

on_open 在 accept() 返回之前触发,调用方此时还拿不到返回值——头文件
里把这条时序写清楚,应用应当用回调参数接上会话。

验证

http3_webtransport_func 里加了三条断言:服务端 on_open 恰好一次、先于
accept() 返回;原有的"被拒的会话不触发 on_open"仍然成立。

  • 去掉这一句:FAIL: 服务端 on_open 恰好触发一次(实际 0)
  • 加上:all checks passed

本机 cmake --build --target test_http3_webtransport_func 通过(HTTP3 + QUIC +
OpenSSL 静态,draft-13)。

`uvcpp_h3_wt_session::accept()` 发完 200 就返回了:会话建得出来,但服务端的
`on_open` **永远不触发**。客户端那条路(`on_connect_response()`)在 2xx 到达
后是把 on_open 调出去的,服务端漏了这一句 —— 而应用没有旁路能拿到会话
(`accept()` 的返回值要等它返回之后才有),于是流的落点、datagram 的分发都
接不上:自己开的双向流拿不到、datagram 全被丢掉。

补上这一句,并在 `http3_webtransport_func` 里钉住它:服务端 on_open 恰好一次、
且先于 accept() 返回。去掉这一句时该用例红(实际 0),补上就绿。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant