Rust in Everything
基于 axum 0.8.9

WebSocket

WebSocket 要开 ws feature,代码全在 axum/src/extract/ws.rs。axum 在这里做的事很少:它自己完成 HTTP 那一侧的握手(检查请求头、算 Sec-WebSocket-Accept),把「等连接交出来」交给一个后台任务,帧的读写全部交给 tokio-tungstenite。连接怎么从 hyper 手里交出来,在 hyper 卷的 协议升级 一章。

  1. WebSocketUpgrade:提取时按顺序查方法和 Connection、Upgrade、Sec-WebSocket-Key、Sec-WebSocket-Version,失败回 405、400 或 426;on_upgrade 先 spawn 一个等 OnUpgrade 的任务,再返回 101;on_failed_upgrade 什么时候会被调用、什么时候不会;Message 与关闭握手;消息上限默认 64 MiB;HTTP/2 上的扩展 CONNECT 为什么要求路由用 any;升级后的连接不受优雅停机管。
flowchart TB
  reqin["握手请求"] --> ext["WebSocketUpgrade 提取"]
  ext -->|"头不对"| rej["405 / 400 / 426"]
  ext --> onup["on_upgrade"]
  onup --> resp["101 或 HTTP/2 的 200"]
  onup --> task["spawn:等 OnUpgrade"]
  task --> wss["WebSocketStream"]
  wss --> cb["你的回调"]

💬 关联讨论

发起讨论
加载中...