#![allow(dead_code)]
use fsm::{ ParserValue, Success };
use http2::flags::{ FL_PADDED, FL_PRIORITY };
use http2::frame_type::{ FR_CONTINUATION,
FR_DATA,
FR_GO_AWAY,
FR_HEADERS,
FR_PING,
FR_PRIORITY,
FR_PUSH_PROMISE,
FR_RST_STREAM,
FR_SETTINGS,
FR_WINDOW_UPDATE };
use http2::http_handler::HttpHandler;
use http2::parser_state::ParserState;
use byte_slice::ByteStream;
use std::fmt;
macro_rules! actual_length {
($parser:expr) => ({
payload_length!($parser) - pad_length!($parser)
});
}
macro_rules! dec_payload_length {
($parser:expr, $length:expr) => ({
$parser.bit_data32a = ($parser.bit_data32a & 0xFF)
| (($parser.bit_data32a >> 8) - $length) << 8;
});
}
macro_rules! get_u8 {
($context:expr) => ({
bs_jump!($context, 1);
$context.stream[$context.stream_index - 1]
});
}
macro_rules! has_flag {
($parser:expr, $flag:expr) => (
$parser.bit_data16a as u8 & $flag == $flag
);
}
macro_rules! pad_length {
($parser:expr) => ({
$parser.bit_data32a & 0xFF
});
}
macro_rules! payload_length {
($parser:expr) => ({
$parser.bit_data32a >> 8
});
}
macro_rules! parse_payload_data {
($parser:expr, $handler:expr, $context:expr, $callback:ident) => ({
if bs_available!($context) >= actual_length!($parser) as usize {
bs_jump!($context, actual_length!($parser) as usize);
dec_payload_length!($parser, actual_length!($parser));
if $parser.bit_data32a & 0xFF > 0 {
set_state!($parser, FramePadding, frame_padding);
} else {
set_state!($parser, FrameLength1, frame_length1);
}
if $handler.$callback(bs_slice!($context), true) {
transition!($parser, $context);
} else {
exit_callback!($parser, $context);
}
}
dec_payload_length!($parser, bs_available!($context) as u32);
bs_jump!($context, bs_available!($context));
if $handler.$callback(bs_slice!($context), false) {
exit_eos!($parser, $context);
} else {
exit_callback!($parser, $context);
}
});
}
macro_rules! read_u16 {
($context:expr, $into:expr) => ({
$into |= ($context.stream[$context.stream_index] as u16) << 8;
$into |= $context.stream[$context.stream_index + 1] as u16;
bs_jump!($context, 2);
});
}
macro_rules! read_u32 {
($context:expr, $into:expr) => ({
$into |= ($context.stream[$context.stream_index] as u32) << 24;
$into |= ($context.stream[$context.stream_index + 1] as u32) << 16;
$into |= ($context.stream[$context.stream_index + 2] as u32) << 8;
$into |= $context.stream[$context.stream_index + 3] as u32;
bs_jump!($context, 4);
});
}
#[derive(Clone,Copy,PartialEq)]
pub enum ParserError {
Dead
}
impl ParserError {
fn format(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
match *self {
ParserError::Dead => {
write!(formatter, "<ParserError::Dead>")
},
}
}
}
impl fmt::Debug for ParserError {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
self.format(formatter)
}
}
impl fmt::Display for ParserError {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
self.format(formatter)
}
}
pub struct Parser<'a, T: HttpHandler + 'a> {
bit_data32a: u32,
bit_data32b: u32,
bit_data16a: u16,
bit_data16b: u16,
byte_count: usize,
state: ParserState,
state_function: fn(&mut Parser<'a, T>, &mut T, &mut ByteStream)
-> Result<ParserValue, ParserError>
}
impl<'a, T: HttpHandler + 'a> Parser<'a, T> {
pub fn new() -> Parser<'a, T> {
Parser{ bit_data32a: 0,
bit_data32b: 0,
bit_data16a: 0,
bit_data16b: 0,
byte_count: 0,
state: ParserState::FrameLength1,
state_function: Parser::frame_length1 }
}
pub fn byte_count(&self) -> usize {
self.byte_count
}
pub fn reset(&mut self) {
self.byte_count = 0;
self.state = ParserState::FrameLength1;
self.state_function = Parser::frame_length1;
self.reset_bit_data();
}
fn reset_bit_data(&mut self) {
self.bit_data32a = 0;
self.bit_data32b = 0;
self.bit_data16a = 0;
self.bit_data16b = 0;
}
#[inline]
pub fn resume(&mut self, mut handler: &mut T, stream: &[u8]) -> Result<Success, ParserError> {
let mut context = ByteStream::new(stream);
loop {
match (self.state_function)(self, &mut handler, &mut context) {
Ok(ParserValue::Continue) => {
},
Ok(ParserValue::Exit(success)) => {
self.byte_count += context.stream_index;
if let Success::Finished(_) = success {
self.state = ParserState::Finished;
}
return Ok(success);
},
Err(error) => {
self.byte_count += context.stream_index;
self.state = ParserState::Dead;
self.state_function = Parser::dead;
return Err(error);
}
}
}
}
pub fn state(&self) -> ParserState {
self.state
}
#[inline]
fn frame_length1(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.reset_bit_data();
if bs_available!(context) >= 4 {
read_u32!(context, self.bit_data32a);
transition!(
self,
context,
FrameFlags,
frame_flags
);
}
self.bit_data32a |= (get_u8!(context) as u32) << 24;
transition!(
self,
context,
FrameLength2,
frame_length2
);
}
#[inline]
fn frame_length2(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32a |= (get_u8!(context) as u32) << 16;
transition!(
self,
context,
FrameLength3,
frame_length3
);
}
#[inline]
fn frame_length3(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32a |= (get_u8!(context) as u32) << 8;
transition!(
self,
context,
FrameType,
frame_type
);
}
#[inline]
fn frame_type(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32a |= get_u8!(context) as u32;
transition!(
self,
context,
FrameFlags,
frame_flags
);
}
#[inline]
fn frame_flags(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data16a = get_u8!(context) as u16;
transition!(
self,
context,
FrameStreamId1,
frame_stream_id1
);
}
#[inline]
fn frame_stream_id1(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
if bs_available!(context) >= 4 {
read_u32!(context, self.bit_data32b);
transition!(
self,
context,
FrameFormatEnd,
frame_format_end
);
}
self.bit_data32b = (get_u8!(context) as u32) << 24;
transition!(
self,
context,
FrameStreamId2,
frame_stream_id2
);
}
#[inline]
fn frame_stream_id2(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32b = (get_u8!(context) as u32) << 16;
transition!(
self,
context,
FrameStreamId3,
frame_stream_id3
);
}
#[inline]
fn frame_stream_id3(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32b = (get_u8!(context) as u32) << 8;
transition!(
self,
context,
FrameStreamId4,
frame_stream_id4
);
}
#[inline]
fn frame_stream_id4(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32b |= get_u8!(context) as u32;
transition!(
self,
context,
FrameFormatEnd,
frame_format_end
);
}
#[inline]
fn frame_format_end(&mut self, handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
match (self.bit_data32a & 0xFF) as u8 {
FR_DATA => {
if has_flag!(self, FL_PADDED) {
set_state!(self, DataPadLength, data_pad_length);
} else {
set_state!(self, DataData, data_data);
}
},
FR_HEADERS => {
if has_flag!(self, FL_PADDED) {
if has_flag!(self, FL_PRIORITY) {
set_state!(
self,
HeadersPadLengthWithPriority,
headers_pad_length_with_priority
);
} else {
set_state!(
self,
HeadersPadLengthWithoutPriority,
headers_pad_length_without_priority
);
}
} else if has_flag!(self, FL_PRIORITY) {
set_state!(self, HeadersStreamId1, headers_stream_id1);
} else {
set_state!(self, HeadersFragment, headers_fragment);
}
},
FR_PRIORITY => {
set_state!(self, PriorityStreamId1, priority_stream_id1);
},
FR_RST_STREAM => {
set_state!(self, RstStreamErrorCode1, rst_stream_error_code1);
},
FR_SETTINGS => {
set_state!(self, SettingsId1, settings_id1);
},
FR_PUSH_PROMISE => {
if has_flag!(self, FL_PADDED) {
set_state!(self, PushPromisePadLength, push_promise_pad_length);
} else {
set_state!(self, PushPromiseStreamId1, push_promise_stream_id1);
}
},
FR_PING => {
set_state!(self, PingData, ping_data);
},
FR_GO_AWAY => {
set_state!(self, GoAwayStreamId1, go_away_stream_id1);
},
FR_WINDOW_UPDATE => {
set_state!(self, WindowUpdateIncrement1, window_update_increment1);
},
FR_CONTINUATION => {
set_state!(self, HeadersFragment, headers_fragment);
},
_ => {
if has_flag!(self, FL_PADDED) {
set_state!(self, UnsupportedPadLength, unsupported_pad_length);
} else {
set_state!(self, UnsupportedData, unsupported_data);
}
}
}
if handler.on_frame_format(
payload_length!(self),
(self.bit_data32a & 0xFF) as u8,
self.bit_data16a as u8,
self.bit_data32b & 0x7FFFFFFF
) {
self.bit_data16a = 0;
self.bit_data32a &= 0xFFFFFF00;
self.bit_data32b = 0;
transition!(self, context);
} else {
self.bit_data16a = 0;
self.bit_data32a &= 0xFFFFFF00;
self.bit_data32b = 0;
exit_callback!(self, context);
}
}
#[inline]
fn frame_padding(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
if bs_available!(context) >= payload_length!(self) as usize {
bs_jump!(context, payload_length!(self) as usize);
transition!(
self,
context,
FrameLength1,
frame_length1
);
}
dec_payload_length!(self, bs_available!(context) as u32);
bs_jump!(context, bs_available!(context));
exit_eos!(self, context);
}
#[inline]
fn data_pad_length(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32a |= get_u8!(context) as u32;
dec_payload_length!(self, 1);
transition!(
self,
context,
DataData,
data_data
);
}
#[inline]
fn data_data(&mut self, handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
parse_payload_data!(
self,
handler,
context,
on_data
);
}
#[inline]
fn go_away_stream_id1(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
if bs_available!(context) >= 4 {
read_u32!(context, self.bit_data32b);
transition!(
self,
context,
GoAwayErrorCode1,
go_away_error_code1
);
}
self.bit_data32b |= (get_u8!(context) as u32) << 24;
transition!(
self,
context,
GoAwayStreamId2,
go_away_stream_id2
);
}
#[inline]
fn go_away_stream_id2(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32b |= (get_u8!(context) as u32) << 16;
transition!(
self,
context,
GoAwayStreamId3,
go_away_stream_id3
);
}
#[inline]
fn go_away_stream_id3(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32b |= (get_u8!(context) as u32) << 8;
transition!(
self,
context,
GoAwayStreamId3,
go_away_stream_id3
);
}
#[inline]
fn go_away_stream_id4(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32b |= get_u8!(context) as u32;
transition!(
self,
context,
GoAwayErrorCode1,
go_away_error_code1
);
}
#[inline]
fn go_away_error_code1(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
if bs_available!(context) >= 4 {
read_u16!(context, self.bit_data16a);
read_u16!(context, self.bit_data16b);
transition!(
self,
context,
GoAwayCallback,
go_away_callback
);
}
self.bit_data16a |= (get_u8!(context) as u16) << 8;
transition!(
self,
context,
GoAwayErrorCode2,
go_away_error_code2
);
}
#[inline]
fn go_away_error_code2(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data16a |= get_u8!(context) as u16;
transition!(
self,
context,
GoAwayErrorCode3,
go_away_error_code3
);
}
#[inline]
fn go_away_error_code3(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data16b |= (get_u8!(context) as u16) << 8;
transition!(
self,
context,
GoAwayErrorCode4,
go_away_error_code4
);
}
#[inline]
fn go_away_error_code4(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data16b |= get_u8!(context) as u16;
transition!(
self,
context,
GoAwayCallback,
go_away_callback
);
}
#[inline]
fn go_away_callback(&mut self, handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
dec_payload_length!(self, 8);
if payload_length!(self) > 0 {
set_state!(self, GoAwayDebugData, go_away_debug_data);
} else {
set_state!(self, FrameLength1, frame_length1);
}
if handler.on_go_away(
self.bit_data32b & 0x7FFFFFFF,
(self.bit_data16a as u32) << 16 | self.bit_data16b as u32
) {
transition!(self, context);
} else {
exit_callback!(self, context);
}
}
#[inline]
fn go_away_debug_data(&mut self, handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
parse_payload_data!(
self,
handler,
context,
on_go_away_debug_data
);
}
#[inline]
fn headers_pad_length_with_priority(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32a |= get_u8!(context) as u32;
dec_payload_length!(self, 1);
transition!(
self,
context,
HeadersStreamId1,
headers_stream_id1
);
}
#[inline]
fn headers_pad_length_without_priority(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32a |= get_u8!(context) as u32;
dec_payload_length!(self, 1);
transition!(
self,
context,
HeadersCallback,
headers_callback
);
}
#[inline]
fn headers_stream_id1(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
if bs_available!(context) >= 4 {
read_u32!(context, self.bit_data32b);
transition!(
self,
context,
HeadersWeight,
headers_weight
);
}
self.bit_data32b |= (get_u8!(context) as u32) << 24;
transition!(
self,
context,
HeadersStreamId2,
headers_stream_id2
);
}
#[inline]
fn headers_stream_id2(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32b |= (get_u8!(context) as u32) << 16;
transition!(
self,
context,
HeadersStreamId3,
headers_stream_id3
);
}
#[inline]
fn headers_stream_id3(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32b |= (get_u8!(context) as u32) << 8;
transition!(
self,
context,
HeadersStreamId4,
headers_stream_id4
);
}
#[inline]
fn headers_stream_id4(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32b |= get_u8!(context) as u32;
transition!(
self,
context,
HeadersWeight,
headers_weight
);
}
#[inline]
fn headers_weight(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data16a = (get_u8!(context) as u16) << 8;
dec_payload_length!(self, 5);
transition!(
self,
context,
HeadersCallback,
headers_callback
);
}
#[inline]
fn headers_callback(&mut self, handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
if handler.on_headers(
self.bit_data32b >> 31 == 1,
self.bit_data32b & 0x7FFFFFFF,
(self.bit_data16a >> 8) as u8
) {
transition!(
self,
context,
HeadersFragment,
headers_fragment
);
}
exit_callback!(
self,
context,
HeadersFragment,
headers_fragment
);
}
#[inline]
fn headers_fragment(&mut self, handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
parse_payload_data!(
self,
handler,
context,
on_headers_fragment
);
}
#[inline]
fn ping_data(&mut self, handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
parse_payload_data!(
self,
handler,
context,
on_ping
);
}
#[inline]
fn priority_stream_id1(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
if bs_available!(context) >= 4 {
read_u32!(context, self.bit_data32b);
transition!(
self,
context,
PriorityWeight,
priority_weight
);
}
self.bit_data32b |= (get_u8!(context) as u32) << 24;
transition!(
self,
context,
PriorityStreamId2,
priority_stream_id2
);
}
#[inline]
fn priority_stream_id2(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32b |= (get_u8!(context) as u32) << 16;
transition!(
self,
context,
PriorityStreamId3,
priority_stream_id3
);
}
#[inline]
fn priority_stream_id3(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32b |= (get_u8!(context) as u32) << 8;
transition!(
self,
context,
PriorityStreamId4,
priority_stream_id4
);
}
#[inline]
fn priority_stream_id4(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32b |= get_u8!(context) as u32;
transition!(
self,
context,
PriorityWeight,
priority_weight
);
}
#[inline]
fn priority_weight(&mut self, handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
if handler.on_priority(
(self.bit_data32b >> 31) == 1,
self.bit_data32b & 0x7FFFFFFF,
get_u8!(context)
) {
transition!(
self,
context,
FrameLength1,
frame_length1
);
}
exit_callback!(
self,
context,
FrameLength1,
frame_length1
);
}
#[inline]
fn push_promise_pad_length(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32a |= get_u8!(context) as u32;
dec_payload_length!(self, 1);
transition!(
self,
context,
PushPromiseStreamId1,
push_promise_stream_id1
);
}
#[inline]
fn push_promise_stream_id1(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
if bs_available!(context) >= 4 {
read_u32!(context, self.bit_data32b);
transition!(
self,
context,
PushPromiseCallback,
push_promise_callback
);
}
self.bit_data32b |= (get_u8!(context) as u32) << 24;
transition!(
self,
context,
PushPromiseStreamId2,
push_promise_stream_id2
);
}
#[inline]
fn push_promise_stream_id2(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32b |= (get_u8!(context) as u32) << 16;
transition!(
self,
context,
PushPromiseStreamId3,
push_promise_stream_id3
);
}
#[inline]
fn push_promise_stream_id3(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32b |= (get_u8!(context) as u32) << 8;
transition!(
self,
context,
PushPromiseStreamId4,
push_promise_stream_id4
);
}
#[inline]
fn push_promise_stream_id4(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32b |= get_u8!(context) as u32;
transition!(
self,
context,
PushPromiseCallback,
push_promise_callback
);
}
#[inline]
fn push_promise_callback(&mut self, handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
dec_payload_length!(self, 4);
if handler.on_push_promise(self.bit_data32b) {
transition!(
self,
context,
HeadersFragment,
headers_fragment
);
}
exit_callback!(
self,
context,
HeadersFragment,
headers_fragment
);
}
#[inline]
fn rst_stream_error_code1(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
if bs_available!(context) >= 4 {
read_u32!(context, self.bit_data32b);
transition!(
self,
context,
RstStreamCallback,
rst_stream_callback
);
}
self.bit_data32b |= (get_u8!(context) as u32) << 24;
transition!(
self,
context,
RstStreamErrorCode2,
rst_stream_error_code2
);
}
#[inline]
fn rst_stream_error_code2(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32b |= (get_u8!(context) as u32) << 16;
transition!(
self,
context,
RstStreamErrorCode3,
rst_stream_error_code3
);
}
#[inline]
fn rst_stream_error_code3(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32b |= (get_u8!(context) as u32) << 8;
transition!(
self,
context,
RstStreamErrorCode4,
rst_stream_error_code4
);
}
#[inline]
fn rst_stream_error_code4(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32b |= get_u8!(context) as u32;
transition!(
self,
context,
RstStreamCallback,
rst_stream_callback
);
}
#[inline]
fn rst_stream_callback(&mut self, handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
if handler.on_rst_stream(self.bit_data32b) {
transition!(
self,
context,
FrameLength1,
frame_length1
);
}
exit_callback!(
self,
context,
FrameLength1,
frame_length1
);
}
#[inline]
fn settings_id1(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
if bs_available!(context) >= 2 {
read_u16!(context, self.bit_data16a);
transition!(
self,
context,
SettingsValue1,
settings_value1
);
}
self.bit_data16a |= (get_u8!(context) as u16) << 8;
transition!(
self,
context,
SettingsId2,
settings_id2
);
}
#[inline]
fn settings_id2(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data16a |= get_u8!(context) as u16;
transition!(
self,
context,
SettingsValue1,
settings_value1
);
}
#[inline]
fn settings_value1(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
if bs_available!(context) >= 4 {
read_u32!(context, self.bit_data32b);
transition!(
self,
context,
SettingsCallback,
settings_callback
);
}
self.bit_data32b |= (get_u8!(context) as u32) << 24;
transition!(
self,
context,
SettingsValue2,
settings_value2
);
}
#[inline]
fn settings_value2(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32b |= (get_u8!(context) as u32) << 16;
transition!(
self,
context,
SettingsValue3,
settings_value3
);
}
#[inline]
fn settings_value3(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32b |= (get_u8!(context) as u32) << 8;
transition!(
self,
context,
SettingsValue3,
settings_value3
);
}
#[inline]
fn settings_value4(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32b |= get_u8!(context) as u32;
transition!(
self,
context,
SettingsCallback,
settings_callback
);
}
#[inline]
fn settings_callback(&mut self, handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
if handler.on_settings(self.bit_data16a, self.bit_data32b) {
transition!(
self,
context,
FrameLength1,
frame_length1
)
}
exit_callback!(
self,
context,
FrameLength1,
frame_length1
);
}
#[inline]
fn window_update_increment1(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
if bs_available!(context) >= 4 {
read_u32!(context, self.bit_data32b);
transition!(
self,
context,
WindowUpdateCallback,
window_update_callback
);
}
self.bit_data32b |= (get_u8!(context) as u32) << 24;
transition!(
self,
context,
WindowUpdateIncrement2,
window_update_increment2
);
}
#[inline]
fn window_update_increment2(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32b |= (get_u8!(context) as u32) << 16;
transition!(
self,
context,
WindowUpdateIncrement3,
window_update_increment3
);
}
#[inline]
fn window_update_increment3(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32b |= (get_u8!(context) as u32) << 8;
transition!(
self,
context,
WindowUpdateIncrement4,
window_update_increment4
);
}
#[inline]
fn window_update_increment4(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32b |= get_u8!(context) as u32;
transition!(
self,
context,
WindowUpdateCallback,
window_update_callback
);
}
#[inline]
fn window_update_callback(&mut self, handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
if handler.on_window_update(self.bit_data32b) {
transition!(
self,
context,
FrameLength1,
frame_length1
);
}
exit_callback!(
self,
context,
FrameLength1,
frame_length1
);
}
#[inline]
fn unsupported_pad_length(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
self.bit_data32a |= get_u8!(context) as u32;
dec_payload_length!(self, 1);
transition!(
self,
context,
UnsupportedData,
unsupported_data
);
}
#[inline]
fn unsupported_data(&mut self, handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_if_eos!(self, context);
parse_payload_data!(
self,
handler,
context,
on_unsupported
);
}
#[inline]
fn dead(&mut self, _handler: &mut T, _context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_error!(Dead);
}
#[inline]
fn finished(&mut self, _handler: &mut T, context: &mut ByteStream)
-> Result<ParserValue, ParserError> {
exit_finished!(self, context);
}
}