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)
}
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)
}
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)
}
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)
}
}