HT2::StreamStateMachine
Inherits Reference < Object
Constants
ALLOWED_EVENTS = {StreamState::IDLE => [Event::SendHeaders, Event::SendHeadersEndStream, Event::ReceiveHeaders, Event::ReceiveHeadersEndStream, Event::SendRstStream, Event::ReceiveRstStream], StreamState::RESERVED_LOCAL => [Event::SendHeaders, Event::SendRstStream, Event::ReceiveRstStream], StreamState::RESERVED_REMOTE => [Event::ReceiveHeaders, Event::SendRstStream, Event::ReceiveRstStream], StreamState::OPEN => [Event::SendHeaders, Event::SendHeadersEndStream, Event::SendData, Event::SendDataEndStream, Event::ReceiveHeaders, Event::ReceiveHeadersEndStream, Event::ReceiveData, Event::ReceiveDataEndStream, Event::SendRstStream, Event::ReceiveRstStream], StreamState::HALF_CLOSED_LOCAL => [Event::ReceiveHeaders, Event::ReceiveHeadersEndStream, Event::ReceiveData, Event::ReceiveDataEndStream, Event::SendRstStream, Event::ReceiveRstStream], StreamState::HALF_CLOSED_REMOTE => [Event::SendHeaders, Event::SendHeadersEndStream, Event::SendData, Event::SendDataEndStream, Event::SendRstStream, Event::ReceiveRstStream], StreamState::CLOSED => [] of Event}
Define which events are allowed in each state (even if they don't cause transitions)
TRANSITIONS = { {StreamState::IDLE, Event::SendHeaders} => StreamState::OPEN, {StreamState::IDLE, Event::SendHeadersEndStream} => StreamState::HALF_CLOSED_LOCAL, {StreamState::IDLE, Event::ReceiveHeaders} => StreamState::OPEN, {StreamState::IDLE, Event::ReceiveHeadersEndStream} => StreamState::HALF_CLOSED_REMOTE, {StreamState::IDLE, Event::SendRstStream} => StreamState::CLOSED, {StreamState::IDLE, Event::ReceiveRstStream} => StreamState::CLOSED, {StreamState::RESERVED_LOCAL, Event::SendHeaders} => StreamState::HALF_CLOSED_REMOTE, {StreamState::RESERVED_LOCAL, Event::SendRstStream} => StreamState::CLOSED, {StreamState::RESERVED_LOCAL, Event::ReceiveRstStream} => StreamState::CLOSED, {StreamState::RESERVED_REMOTE, Event::ReceiveHeaders} => StreamState::HALF_CLOSED_LOCAL, {StreamState::RESERVED_REMOTE, Event::SendRstStream} => StreamState::CLOSED, {StreamState::RESERVED_REMOTE, Event::ReceiveRstStream} => StreamState::CLOSED, {StreamState::OPEN, Event::SendDataEndStream} => StreamState::HALF_CLOSED_LOCAL, {StreamState::OPEN, Event::SendHeadersEndStream} => StreamState::HALF_CLOSED_LOCAL, {StreamState::OPEN, Event::ReceiveDataEndStream} => StreamState::HALF_CLOSED_REMOTE, {StreamState::OPEN, Event::ReceiveHeadersEndStream} => StreamState::HALF_CLOSED_REMOTE, {StreamState::OPEN, Event::SendRstStream} => StreamState::CLOSED, {StreamState::OPEN, Event::ReceiveRstStream} => StreamState::CLOSED, {StreamState::HALF_CLOSED_LOCAL, Event::ReceiveDataEndStream} => StreamState::CLOSED, {StreamState::HALF_CLOSED_LOCAL, Event::ReceiveHeadersEndStream} => StreamState::CLOSED, {StreamState::HALF_CLOSED_LOCAL, Event::SendRstStream} => StreamState::CLOSED, {StreamState::HALF_CLOSED_LOCAL, Event::ReceiveRstStream} => StreamState::CLOSED, {StreamState::HALF_CLOSED_REMOTE, Event::SendDataEndStream} => StreamState::CLOSED, {StreamState::HALF_CLOSED_REMOTE, Event::SendHeadersEndStream} => StreamState::CLOSED, {StreamState::HALF_CLOSED_REMOTE, Event::SendRstStream} => StreamState::CLOSED, {StreamState::HALF_CLOSED_REMOTE, Event::ReceiveRstStream} => StreamState::CLOSED}
Define all valid state transitions
Constructors
new(stream_id : UInt32, current_state : StreamState = StreamState::IDLE)
SourceClass methods
headers_event(end_stream : Bool, sending : Bool) : Event
Get the appropriate event for headers
Instance methods
current_state
Sourcestream_id
Sourcestream_id=(stream_id : UInt32)
Sourcetransition(event : Event) : TransitionResult
Attempt to transition to a new state based on an event
validate_receive_data
Sourcevalidate_receive_headers
Sourcevalidate_send_data
Source