a few lines in between classes

This commit is contained in:
maxstrb 2025-10-20 14:55:20 +02:00
parent bb9fe7aec0
commit a4b1902fa5
3 changed files with 43 additions and 7 deletions

View file

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

View file

@ -50,8 +50,8 @@ impl Connection {
#[derive(Debug, PartialEq)]
pub struct Upgrade {
protocol: Protocol,
version: Box<str>,
pub protocol: Protocol,
pub version: Box<str>,
}
impl FromStr for Upgrade {

View file

@ -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<Self> {
todo!()
pub fn initialize_connection(req: Request, stream: TcpStream) -> tokio::io::Result<Self> {
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"))
}
}
}