#websocket-server #websocket #sha-1 #base64 #closures #scratch #programmed

bin+lib webrocket

关注闭包的 WebSocket 服务器实现

1 个不稳定版本

0.1.0 2023年1月26日

#959 in 异步

自定义许可

43KB
1K SLoC

webrocket

WebRocket 🚀 是一个从头开始用 Rust 编写的 WebSocket 服务器库(包括 SHA-1 和 Base64)。

注意:此项目是为了学习 Rust 而创建的,因此可能会发生重大变化。

安装

要将 crates.io 上的库发布版本添加到 Cargo 项目中,请将以下内容添加到 Cargo.toml 的 'dependencies' 部分

请勿在生产环境中使用。

webrocket = "0.1.0"

用法

由于我是一个很大的 闭包 粉丝,许多函数都作为闭包提供,例如 on_connection 或 on_message。

要启动一个回显服务器,只需以下代码


let mut ws = WebSocket::bind("0.0.0.0:3000").await?;

ws.on_connection(|wsc| {
    println!("New connection");

    wsc.on_message(|wsc, msg| {
        println!("New message: {}", msg);
        wsc.send_message(msg);
    });

    wsc.on_close(|_, code, reason| {
        println!("Connection closed ({:?}) with '{}' as reason.", code, reason);
    });
});

ws.listen().await;

测试

服务器实现已通过以下方式使用 Autobahn|Testsuite 进行测试

$ RUST_LOG=debug cargo run --bin wsserver_autobahn

$ docker run -it --rm --net=host \
  -v "${PWD}/tests:/config" \
  -v "${PWD}/tests/reports:/reports" \
  --name fuzzingclient \
  crossbario/autobahn-testsuite \
  wstest -m fuzzingclient --spec /config/fuzzingclient.json

代码中也有测试,可以通过 cargo test 启动。

标准

已实现

待完成

副项目

在我用 Rust 编写 WebSocket 之前,我首先用 C++ 编写了它,以学习 C++。我现在使用这个实现,它位于 fun-with-cpp 分支中,作为例如模糊测试的游乐场。

要求(cpp)

  • CMake 3.22.1 brew install cmake
  • C++17 兼容的编译器

检查 flags.h 中的编译选项(!)

#define COMPILE_FOR_FUZZING 0
#define ARTIFICIAL_BUGS     0

构建 & 运行

./build.sh run

构建 & 测试

./build.sh test [sha1]

依赖项

~6–15MB
~172K SLoC