Add webocket frame header
This commit is contained in:
@ -4,6 +4,7 @@ use crate::http;
|
|||||||
use base64;
|
use base64;
|
||||||
use crypto;
|
use crypto;
|
||||||
use crypto::digest::Digest;
|
use crypto::digest::Digest;
|
||||||
|
use crate::websocket::FrameHeader;
|
||||||
|
|
||||||
pub fn connection_handler(
|
pub fn connection_handler(
|
||||||
client: &mut http::HttpStream,
|
client: &mut http::HttpStream,
|
||||||
@ -99,11 +100,26 @@ pub fn connection_handler(
|
|||||||
res.send(&mut client.stream).unwrap();
|
res.send(&mut client.stream).unwrap();
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let mut buf = [0u8; 8192];
|
let header = FrameHeader::from(&mut client.stream).unwrap();
|
||||||
let res = client.stream.read(&mut buf).unwrap();
|
if header.mask {
|
||||||
if res == 0 {
|
println!("Mask: {:X}", header.masking_key.unwrap());
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
println!("Msg: {}/{}", res, String::from_utf8_lossy(&buf));
|
|
||||||
|
let mut buf = [0u8; 8192];
|
||||||
|
client.stream.read_exact(&mut buf[..header.payload_len() as usize]).unwrap();
|
||||||
|
|
||||||
|
if header.mask {
|
||||||
|
let key: [u8; 4] = [
|
||||||
|
(header.masking_key.unwrap() >> 24) as u8,
|
||||||
|
((header.masking_key.unwrap() >> 16) & 0xFF) as u8,
|
||||||
|
((header.masking_key.unwrap() >> 8) & 0xFF) as u8,
|
||||||
|
(header.masking_key.unwrap() & 0xFF) as u8,
|
||||||
|
];
|
||||||
|
for (pos, byte) in buf.iter_mut().enumerate() {
|
||||||
|
*byte ^= key[pos % 4];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("Msg: {}", String::from_utf8_lossy(&buf[..header.payload_len() as usize]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,61 @@
|
|||||||
mod handler;
|
mod handler;
|
||||||
|
|
||||||
pub use handler::*;
|
pub use handler::*;
|
||||||
|
use crate::http::Stream;
|
||||||
|
use crate::error::Error;
|
||||||
|
|
||||||
|
pub struct FrameHeader {
|
||||||
|
fin: bool,
|
||||||
|
rsv1: bool,
|
||||||
|
rsv2: bool,
|
||||||
|
rsv3: bool,
|
||||||
|
opcode: u8,
|
||||||
|
mask: bool,
|
||||||
|
payload_len: u8,
|
||||||
|
ex_payload_len: Option<u64>,
|
||||||
|
masking_key: Option<u32>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FrameHeader {
|
||||||
|
pub fn from(socket: &mut Stream) -> Result<Self, Error> {
|
||||||
|
let mut data = [0u8; 2];
|
||||||
|
socket.read_exact(&mut data)?;
|
||||||
|
|
||||||
|
let mut header = FrameHeader {
|
||||||
|
fin: data[0] & 0x80 != 0,
|
||||||
|
rsv1: data[0] & 0x40 != 0,
|
||||||
|
rsv2: data[0] & 0x20 != 0,
|
||||||
|
rsv3: data[0] & 0x10 != 0,
|
||||||
|
opcode: data[0] & 0x0F,
|
||||||
|
mask: data[1] & 0x80 != 0,
|
||||||
|
payload_len: data[1] & 0x7F,
|
||||||
|
ex_payload_len: None,
|
||||||
|
masking_key: None,
|
||||||
|
};
|
||||||
|
|
||||||
|
if header.payload_len == 126 {
|
||||||
|
let mut data = [0u8; 2];
|
||||||
|
socket.read_exact(&mut data)?;
|
||||||
|
header.ex_payload_len = Some(u16::from_be_bytes(data) as u64);
|
||||||
|
} else if header.payload_len == 127 {
|
||||||
|
let mut data = [0u8; 8];
|
||||||
|
socket.read_exact(&mut data)?;
|
||||||
|
header.ex_payload_len = Some(u64::from_be_bytes(data));
|
||||||
|
}
|
||||||
|
|
||||||
|
if header.mask {
|
||||||
|
let mut data =[0u8; 4];
|
||||||
|
socket.read_exact(&mut data)?;
|
||||||
|
header.masking_key = Some(u32::from_be_bytes(data));
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(header)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn payload_len(&self) -> u64 {
|
||||||
|
match self.ex_payload_len {
|
||||||
|
Some(val) => val,
|
||||||
|
None => self.payload_len as u64,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user