Add webocket frame header
This commit is contained in:
@ -1,3 +1,61 @@
|
||||
mod 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