br-web 0.6.0

This is an WEB SERVER
Documentation
use std::io::{Read};
use std::net::TcpStream;
use log::{error, info};
use openssl::ssl::SslStream;
use crate::web_socket_message::WebSocketMessage;

const BUFFER_SIZE: usize = 1024 * 512;
const HEADER_SIZE: usize = 128;

pub struct LineReader {}

impl LineReader {
    pub fn new() -> Self {
        LineReader {}
    }
    /// 读取-消息头
    pub fn read_header(&mut self, stream: &mut TcpStream) -> Result<Vec<u8>, String> {
        let mut response = vec![];
        loop {
            let mut buffer = [0u8; HEADER_SIZE];
            match stream.read(&mut buffer) {
                Ok(e) => {
                    response.extend(buffer[..e].to_vec());
                    match e {
                        HEADER_SIZE => {
                            match response.windows(4).position(|window| window == [13, 10, 13, 10]) {
                                None => {
                                    continue;
                                }
                                Some(_e) => {
                                    break;
                                }
                            };
                        }
                        _ => {
                            break;
                        }
                    }
                }
                Err(e) => return Err(format!("读取错误 1001: {}", e))
            }
        }
        Ok(response)
    }
    /// 读取ssl消息头
    pub fn read_header_ssl(&mut self, stream: &mut SslStream<TcpStream>) -> Result<Vec<u8>, String> {
        let mut response = vec![];
        loop {
            let mut buffer = [0u8; HEADER_SIZE];
            match stream.read(&mut buffer) {
                Ok(e) => {
                    response.extend(buffer[..e].to_vec());
                    match e {
                        HEADER_SIZE => {
                            match response.windows(4).position(|window| window == [13, 10, 13, 10]) {
                                None => {
                                    continue;
                                }
                                Some(_) => {
                                    break;
                                }
                            };
                        }
                        _ => {
                            break;
                        }
                    }
                }
                Err(e) => return Err(format!("读取错误 1004: {}", e))
            }
        }
        Ok(response)
    }

    /// 读取消息体
    pub fn read_body(&mut self, stream: &mut TcpStream, content_length: usize, body: Vec<u8>) -> Result<Vec<u8>, String> {
        let mut response = body.clone();
        loop {
            let mut buffer = [0u8; BUFFER_SIZE];
            match stream.read(&mut buffer) {
                Ok(e) => {
                    response.extend(buffer[..e].to_vec());
                    if response.len() >= content_length {
                        break;
                    }
                    continue;
                }
                Err(e) => return Err(format!("读取错误1003: {}", e))
            }
        }
        Ok(response)
    }

    /// 读取ssl消息体
    pub fn read_body_ssl(&mut self, stream: &mut SslStream<TcpStream>, content_length: usize, body: Vec<u8>) -> Result<Vec<u8>, String> {
        let mut response = body.clone();
        loop {
            let mut buffer = [0u8; BUFFER_SIZE];
            match stream.read(&mut buffer) {
                Ok(e) => {
                    response.extend(buffer[..e].to_vec());
                    if response.len() >= content_length {
                        let last_four: Vec<u8> = response.iter().rev().take(2).rev().cloned().collect();
                        if last_four == vec![13, 10] {
                            break;
                        }
                        continue;
                    }
                    continue;
                }
                Err(e) => return Err(format!("读取错误1003: {}", e))
            }
        }
        Ok(response)
    }

    /// 读取-websocket消息
    pub fn read_websocket(&mut self, stream: &mut TcpStream) -> Result<Vec<u8>, String> {
        let mut response = vec![];
        loop {
            let mut buffer = [0u8; HEADER_SIZE];
            match stream.read(&mut buffer) {
                Ok(0) => return Err("连接关闭".to_string()),
                Ok(n) => {
                    response.extend(buffer[..n].to_vec());
                    match WebSocketMessage::parse_message(response.clone()) {
                        Ok(e) => {
                            response = vec![];
                            info!("收到消息: {:?}", e.text);
                            break;
                        }
                        Err(e) => {
                            error!("错误: {}", e);
                            continue;
                        }
                    };
                }
                Err(e) => return Err(format!("连接失败: {}", e))
            }
        }
        Ok(response)
    }
}