Crate twist [] [src]

An implementation of the RFC6455 websocket protocol as a set of tokio Codecs and a tokio-proto pipeline ServerProto

Decode Client Base Frame


use twist::{BaseFrameCodec, OpCode};
use tokio_core::io::{Codec, EasyBuf};

const PING: [u8; 6] = [0x89, 0x80, 0x00, 0x00, 0x00, 0x01];

fn main() {
    let ping_vec = PING.to_vec();
    let mut eb = EasyBuf::from(ping_vec);
    let mut fc: BaseFrameCodec = Default::default();
    fc.set_client(true);
    let mut encoded = Vec::new();

    if let Ok(Some(frame)) = fc.decode(&mut eb) {
        assert!(frame.fin());
        assert!(!frame.rsv1());
        assert!(!frame.rsv2());
        assert!(!frame.rsv3());
        // All client frames must be masked.
        assert!(frame.masked());
        assert!(frame.opcode() == OpCode::Ping);
        assert!(frame.mask() == 1);
        assert!(frame.payload_length() == 0);
        assert!(frame.extension_data().is_none());
        assert!(frame.application_data().is_none());

        if fc.encode(frame, &mut encoded).is_ok() {
            for (a, b) in encoded.iter().zip(PING.to_vec().iter()) {
                assert!(a == b);
            }
        }
    } else {
        assert!(false);
    }
}

Decode Server Base Frame


use twist::{BaseFrameCodec, OpCode};
use tokio_core::io::{Codec, EasyBuf};

const PONG: [u8; 2] = [0x8a, 0x00];

fn main() {
    let ping_vec = PONG.to_vec();
    let mut eb = EasyBuf::from(ping_vec);
    let mut fc: BaseFrameCodec = Default::default();
    let mut encoded = Vec::new();

    if let Ok(Some(frame)) = fc.decode(&mut eb) {
        assert!(frame.fin());
        assert!(!frame.rsv1());
        assert!(!frame.rsv2());
        assert!(!frame.rsv3());
        // All server frames must not be masked.
        assert!(!frame.masked());
        assert!(frame.opcode() == OpCode::Pong);
        assert!(frame.mask() == 0);
        assert!(frame.payload_length() == 0);
        assert!(frame.extension_data().is_none());
        assert!(frame.application_data().is_none());

        if fc.encode(frame, &mut encoded).is_ok() {
            for (a, b) in encoded.iter().zip(PONG.to_vec().iter()) {
                assert!(a == b);
            }
        }
    } else {
        assert!(false);
    }
}

Structs

BaseFrame

Represents the parts of a base frame.

BaseFrameCodec

Codec for dedoding/encoding websocket base frames.

ClientHanshakeCodec

Codec for decoding/encoding websocket client handshake frames.

ServerHandshakeCodec

Codec for decoding/encoding websocket server handshake frames.

TwistCodec

Codec for use with the WebSocketProtocol. Used when decoding/encoding of both websocket handshakes and websocket base frames.

WebSocketFrame

A twist websocket frame. Note a websocket frame is either a client handshake frame, a server handshake frame, or a base frame. They are mutually exclusive.

WebSocketProtocol

The protocol that can bu use to run on a tokio-proto TcpServer to handle websocket handshake and base frames.

Enums

OpCode

Operation codes defined in RFC6455.

Traits

FromHeader

Extensions are built from the Sec-WebSocket-Extensions headers. Build your extension based on that header.

IntoResponse

Server-side extensions should implement this to

PerFrame

A per-frame extension.

PerMessage

A per-message extension.