diff --git a/src/websocket/handler.rs b/src/websocket/handler.rs index 4d5c7d9..bcef3be 100644 --- a/src/websocket/handler.rs +++ b/src/websocket/handler.rs @@ -1,6 +1,7 @@ use crate::error::*; use crate::http; +use crate::usimp; use crate::websocket::*; use base64; use crypto; @@ -12,6 +13,7 @@ pub fn recv_message(client: &mut http::HttpStream) -> Result { loop { let header = FrameHeader::from(&mut client.stream)?; + // FIXME control frames may show up in a fragmented stream if msg_type != 0 && header.opcode != 0 { return Err(Error::new(Kind::WebSocketError, Class::ClientError) .set_desc("continuation frame expected".to_string())); @@ -157,6 +159,10 @@ pub fn handshake( Ok(()) } +pub fn error_handler(error: Error) { + // TODO send error response frame +} + pub fn connection_handler( client: &mut http::HttpStream, req: &http::Request, @@ -167,20 +173,29 @@ pub fn connection_handler( } loop { - let msg = recv_message(client).unwrap(); - match msg { - Message::TextMessage(msg) => { - println!("Data: {}", msg.data); + match recv_message(client) { + Ok(msg) => { + match msg { + Message::TextMessage(msg) => { + // TODO threads? + let req: RequestEnvelope = serde_json::from_str(msg.data.as_str()).unwrap(); + println!("Endpoint: {}, ReqNo: {}, Data: {}", req.endpoint, req.request_nr, req.data); + let a = usimp::endpoint(req.endpoint.as_str(), req.data).unwrap(); + }, + Message::CloseMessage(msg) => { + println!("Received close frame: {}: {}", msg.code.unwrap_or(0), msg.reason.unwrap_or("-".to_string())); + return + } + Message::PingMessage(msg) => { + // TODO send pong + }, + Message::PongMessage(msg) => { + // TODO something + } + } }, - Message::CloseMessage(msg) => { - - return - } - Message::PingMessage(msg) => { - // TODO send pong - }, - Message::PongMessage(msg) => { - // TODO something + Err(error) => { + error_handler(error); } } } diff --git a/src/websocket/mod.rs b/src/websocket/mod.rs index 5fadad0..0954b1c 100644 --- a/src/websocket/mod.rs +++ b/src/websocket/mod.rs @@ -1,5 +1,6 @@ mod handler; +use serde::{Deserialize, Serialize}; use crate::error::Error; use crate::http; pub use handler::*; @@ -45,6 +46,21 @@ pub struct TextMessage { data: String, } +#[derive(Serialize, Deserialize)] +pub struct RequestEnvelope { + endpoint: String, + request_nr: u64, + data: serde_json::Value, +} + +#[derive(Serialize, Deserialize)] +pub struct ResponseEnvelope { + to_request_nr: u64, + status: String, + message: Option, + data: serde_json::Value, +} + impl FrameHeader { pub fn from(socket: &mut http::Stream) -> Result { let mut data = [0u8; 2];