diff --git a/src/main.rs b/src/main.rs index 57b11df..d8f6570 100644 --- a/src/main.rs +++ b/src/main.rs @@ -65,7 +65,9 @@ async fn handle_http_connection( } } ["websocket"] => { - return Ok(Some(WebsocketConnection::initialize_connection(req)?)); + return Ok(Some(WebsocketConnection::initialize_connection( + req, stream, + )?)); } [] => Response::new() .with_code(ResponseCode::PermanentRedirect) diff --git a/src/request.rs b/src/request.rs index 7f18c76..96713ee 100644 --- a/src/request.rs +++ b/src/request.rs @@ -50,8 +50,8 @@ impl Connection { #[derive(Debug, PartialEq)] pub struct Upgrade { - protocol: Protocol, - version: Box, + pub protocol: Protocol, + pub version: Box, } impl FromStr for Upgrade { diff --git a/src/websoket_connection.rs b/src/websoket_connection.rs index bd7ef40..bda29eb 100644 --- a/src/websoket_connection.rs +++ b/src/websoket_connection.rs @@ -1,13 +1,47 @@ -use crate::request::Request; +use crate::{ + request::{Connection, Protocol, Request, RequestHeader}, + response::Response, +}; +use tokio::io; use tokio::net::TcpStream; pub struct WebsocketConnection { - steam: TcpStream, + stream: TcpStream, } impl WebsocketConnection { - pub fn initialize_connection(req: Request) -> tokio::io::Result { - todo!() + pub fn initialize_connection(req: Request, stream: TcpStream) -> tokio::io::Result { + let (mut upgrade, mut connection, mut key_exists) = (false, false, false); + let mut key_val; + + for i in req.headers { + match i { + RequestHeader::Upgrade(upgrad) => { + if let Some(upg) = upgrad.first() + && upg.protocol == Protocol::Websocket + { + upgrade = true; + } + } + RequestHeader::Connection(con) => { + if con == Connection::Upgrade { + connection = true; + } + } + RequestHeader::Other { name, value } => { + if name == "Sec-WebSocket-Key".into() { + key_val = value.clone(); + } + } + _ => (), + } + } + + if !upgrade || !connection || !key_exists { + Ok(Self { stream }) + } else { + Err(io::Error::new(io::ErrorKind::InvalidData, "Wrong request")) + } } }