#net #opcode #github #http #text #com-euvoor-hawk

nightly websocket-rs

为 https://github.com/euvoor/hawk 设计

5 个版本

0.1.4 2020 年 6 月 17 日
0.1.3 2020 年 6 月 17 日
0.1.2 2020 年 6 月 17 日
0.1.1 2020 年 6 月 17 日
0.1.0 2020 年 6 月 8 日

#257 in WebSocket

MIT 许可证

22KB
343

HAWK 设计

示例

use tokio::net::TcpListener;

use http_rs::Http;
use websocket_rs::{ Websocket, Opcode };

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut listener = TcpListener::bind("127.0.0.1:8080").await?;

    println!("Listening for websocket connections on 127.0.0.1:8080");

    while let Ok((stream, addr)) = listener.accept().await {
        tokio::spawn(async move {
            println!("New connection from {:?}", addr);

            let mut http = Http::new(stream);

            if let Some(req) = http.next().await {
                if req.for_websocket() {
                    let mut ws = Websocket::new_with_key(
                        http.transport.into_inner(),
                        req.headers.get("sec-websocket-key").unwrap().to_string()
                    );

                    while let Some(msg) = ws.next().await {
                        println!("{:?}", msg);

                        if msg.opcode == Opcode::Text {
                            let response = format!("Received: {:?}", msg.payload);
                            ws.send_text(response).await.unwrap();
                        }
                    }

                    println!("Client from {:?} disconnected", addr);
                }
            }
        });
    }

    Ok(())
}

待办事项

  • 正确处理错误
  • 接收 TEXT 操作码
  • 收到 Ping 时回复 Pong
  • 处理所有有效负载长度 (le 125, =126, =127)
  • 掩码密钥
  • 关闭 WebSocket 连接
  • 读取分片帧
  • 将 WebSocket 提取到其自己的 crate 中
  • 添加二进制支持
  • 当大小达到阈值时发送分片帧
  • 安排 ping/pong
  • 将 ping 中的应用程序数据包含在 pong 中
  • 跟踪连接的客户端

依赖项

~7–14MB
~129K SLoC