usimp websocket things
This commit is contained in:
@ -1,6 +1,7 @@
|
|||||||
use crate::error::*;
|
use crate::error::*;
|
||||||
use crate::http;
|
use crate::http;
|
||||||
|
|
||||||
|
use crate::usimp;
|
||||||
use crate::websocket::*;
|
use crate::websocket::*;
|
||||||
use base64;
|
use base64;
|
||||||
use crypto;
|
use crypto;
|
||||||
@ -12,6 +13,7 @@ pub fn recv_message(client: &mut http::HttpStream) -> Result<Message, Error> {
|
|||||||
loop {
|
loop {
|
||||||
let header = FrameHeader::from(&mut client.stream)?;
|
let header = FrameHeader::from(&mut client.stream)?;
|
||||||
|
|
||||||
|
// FIXME control frames may show up in a fragmented stream
|
||||||
if msg_type != 0 && header.opcode != 0 {
|
if msg_type != 0 && header.opcode != 0 {
|
||||||
return Err(Error::new(Kind::WebSocketError, Class::ClientError)
|
return Err(Error::new(Kind::WebSocketError, Class::ClientError)
|
||||||
.set_desc("continuation frame expected".to_string()));
|
.set_desc("continuation frame expected".to_string()));
|
||||||
@ -157,6 +159,10 @@ pub fn handshake(
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn error_handler(error: Error) {
|
||||||
|
// TODO send error response frame
|
||||||
|
}
|
||||||
|
|
||||||
pub fn connection_handler(
|
pub fn connection_handler(
|
||||||
client: &mut http::HttpStream,
|
client: &mut http::HttpStream,
|
||||||
req: &http::Request,
|
req: &http::Request,
|
||||||
@ -167,20 +173,29 @@ pub fn connection_handler(
|
|||||||
}
|
}
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let msg = recv_message(client).unwrap();
|
match recv_message(client) {
|
||||||
match msg {
|
Ok(msg) => {
|
||||||
Message::TextMessage(msg) => {
|
match msg {
|
||||||
println!("Data: {}", msg.data);
|
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) => {
|
Err(error) => {
|
||||||
|
error_handler(error);
|
||||||
return
|
|
||||||
}
|
|
||||||
Message::PingMessage(msg) => {
|
|
||||||
// TODO send pong
|
|
||||||
},
|
|
||||||
Message::PongMessage(msg) => {
|
|
||||||
// TODO something
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
mod handler;
|
mod handler;
|
||||||
|
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
use crate::error::Error;
|
use crate::error::Error;
|
||||||
use crate::http;
|
use crate::http;
|
||||||
pub use handler::*;
|
pub use handler::*;
|
||||||
@ -45,6 +46,21 @@ pub struct TextMessage {
|
|||||||
data: String,
|
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<String>,
|
||||||
|
data: serde_json::Value,
|
||||||
|
}
|
||||||
|
|
||||||
impl FrameHeader {
|
impl FrameHeader {
|
||||||
pub fn from(socket: &mut http::Stream) -> Result<Self, Error> {
|
pub fn from(socket: &mut http::Stream) -> Result<Self, Error> {
|
||||||
let mut data = [0u8; 2];
|
let mut data = [0u8; 2];
|
||||||
|
Reference in New Issue
Block a user