Add webocket frame header

This commit is contained in:
2021-05-21 23:07:20 +02:00
parent f1244b4b56
commit 912f2f0bf3
2 changed files with 79 additions and 5 deletions

View File

@ -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,
}
}
}