br-web 0.6.0

This is an WEB SERVER
Documentation
use br_crypto::hex;

#[derive(Debug)]
pub struct WebSocketMessage {
    // message_type: MessageType,
    // payload: Vec<u8>,      // 消息载荷,以字节向量形式表示
    pub text: String,
}

impl WebSocketMessage {
    // 解析WebSocket消息
    pub fn parse_message(data: Vec<u8>) -> Result<WebSocketMessage, String> {
        // 检查数据是否足够长来包含消息类型和载荷长度
        if data.len() < 2 {
            return Err("长度不够".to_string());
        }

        // 解析帧头
        let _fin = (data[0] & 0b1000_0000) != 0;
        let opcode = data[0] & 0b0000_1111;
        let masked = (data[1] & 0b1000_0000) != 0;
        let payload_length = data[1] & 0b0111_1111;

        let mut payload_data = Vec::new();
        let message_tpye = MessageType::from(opcode);
        match message_tpye {
            MessageType::Text => {
                let payload_start_index = if payload_length < 126 {
                    2
                } else if payload_length >= 126 && payload_length as i32 <= 65535 {
                    4
                } else {
                    10
                };
                if masked {
                    let t = i32::from_str_radix(&hex::encode(data[2..payload_start_index].to_vec()), 16).unwrap_or(0);
                    let payload = &data[payload_start_index + 4..];
                    if payload.len() != t as usize && payload_start_index > 2 {
                        return Err("继续加载".to_string());
                    }

                    let mask_key = &data[payload_start_index..payload_start_index + 4];
                    for i in 0..payload.len() {
                        payload_data.push(payload[i] ^ mask_key[i % 4]);
                    }
                } else {
                    payload_data.extend_from_slice(&data[payload_start_index..]);
                }
            }
            MessageType::Binary => {}
            MessageType::Continuation => {}
            MessageType::Close => {
                return Err("关闭消息".to_string());
            }
            MessageType::Ping => {}
            MessageType::Pong => {}
            MessageType::None => {}
        }

        let text = match message_tpye {
            MessageType::Text => {
                unsafe { String::from_utf8_unchecked(payload_data.clone()) }
            }
            _ => "".to_string()
        };

        Ok(WebSocketMessage {
            // message_type: message_tpye,
            // payload: payload_data,
            text,
        })
    }
}

#[derive(Debug)]
enum MessageType {
    Text,
    Continuation,
    Close,
    Binary,
    Ping,
    Pong,
    None,
}

impl MessageType {
    pub fn from(types: u8) -> Self {
        match types {
            0x0 => Self::Continuation,
            0x1 => Self::Text,
            0x2 => Self::Binary,
            0x8 => Self::Close,
            0x9 => Self::Ping,
            0xa => Self::Pong,
            _ => Self::None
        }
    }
}