#codec #tokio-codec #websocket-client #tokio #serverproto

twist

作为 tokio Codec 和 tokio-proto pipeline ServerProto 的 RFC6455 WebSocket 协议实现

15 个版本 (6 个重大更新)

使用旧的 Rust 2015

0.7.1 2017 年 3 月 21 日
0.7.0 2017 年 3 月 19 日
0.6.0 2017 年 3 月 16 日
0.5.3 2017 年 3 月 13 日
0.1.4 2017 年 2 月 23 日

#177WebSocket


5 crate 中使用

MIT/Apache

140KB
3K SLoC

twist

作为 tokio-core Codec 和 tokio-proto pipeline ServerProto 的 RFC6455 WebSocket 协议实现

这可以用来在一个 tokio-proto TcpServer 中提供 tokio-service Service (见 twists 中的示例)。

注意:尽管这是一个作为管道协议实现的,但支持分片 WebSocket 消息,因此支持从 WebSocket 客户端进行流式传输。

用法

在您的 Cargo.toml 依赖项部分包含以下内容

twist = "0.1.3"

扩展

twist 现在支持按消息扩展。当文本或二进制帧完成时,或者一组分片文本或二进制帧完全组装时,应用一个按消息扩展。

实现

twist 提供了三个与实现扩展相关的特质

  1. FromHeader - 根据请求头 Sec-WebSocket-Extensions 的内容进行扩展配置。实现 init 函数以根据此头部配置您的扩展。如果您无法支持给定的头部参数,应返回一个 io::Error。如果参数与您的扩展不相关,您应确保您的 enabled 函数返回 false。

     fn init(&mut self, request: &str) -> Result<(), io::Error> {
         if request.contains("permessage-deflate") {
             self.enabled = true;
             let pmds: Vec<&str> =
                 request.split(',').take_while(|s| s.starts_with("permessage-deflate")).collect();
             for pmd in pmds {
                 // Check the config here.
                 // return io::Error if it is invalid.
             }
         }
         Ok(())
     }
    
  2. IntoResponse - 实现返回 Sec-WebSocket-Extensions 响应头的 response 函数。如果您被禁用,则返回 None

  3. PerMessage - 这是扩展的核心。有三个方法要实现。

    a. reserve_rsv - 如果您的扩展需要使用帧的rsv位之一,您可以尝试预留它。您收到的值代表在扩展链中之前已经预留的位。检查您的位(或位)是否空闲,并将您的位与给定位进行按位或操作,然后返回该值。以下是从 twist-deflate 中的示例。deflate扩展需要rsv1位,因此RSV1为4(0b100)。

     if current_rsv & RSV1 == 0 {
       Ok(current_rsv | RSV1)
     } else {
       Err(other("rsv1 bit already reserved"))
     }
    

    b. decode - 实现此功能以对消息帧进行解码(例如解压缩应用程序数据)。

    c. encode - 实现此功能以在twist最终编码之前对消息帧进行编码(例如压缩应用程序数据)。

有关更完整的示例,请参阅 twist-deflate

文档

文档

示例用法

请参阅 twists 项目,了解使用twist实现的echo服务器的示例实现。

依赖项

~13MB
~228K SLoC