/// <summary> /// Event handler for SM protocol data. /// </summary> /// <param name="sender">the sender object.</param> /// <param name="e">Event arguments.</param> private void OnProtocolData(object sender, StreamEventArgs e) { if (e.Stream == this) { if (SMStreamState.Closed == e.Stream.State) { this.Close(StatusCode.ProtocolError); return; } if (e is HeadersEventArgs) { var args = (HeadersEventArgs)e; this.Headers.Merge(args.Headers); if (this.OnHeadersReceived != null) { this.OnHeadersReceived(this, args); } } else if (e is StreamDataEventArgs) { StreamDataEventArgs arg = e as StreamDataEventArgs; if (arg.IsFin && this.State == SMStreamState.HalfClosed) { this.Close(); } if (this.OnDataReceived != null) { StreamDataEventArgs args = (StreamDataEventArgs)e; this.OnDataReceived(this, e as StreamDataEventArgs); if (Session.IsFlowControlEnabled) { Session.CurrentCreditBalanceFromServer -= args.Data.Data.Length; if (Session.CurrentCreditBalanceFromServer + Session.CreditAddition < Session.MaxCreditBalance) { if (Session.CurrentCreditBalanceFromServer < 0) { SendCreditUpdate(Convert.ToInt32((-1 * Session.CurrentCreditBalanceFromServer / Session.CreditAddition + 1) * Session.CreditAddition)); } else { SendCreditUpdate(Convert.ToInt32(Session.CreditAddition)); } } } } } else if (e is RSTEventArgs) { if (this.OnRSTReceived != null) { this.OnRSTReceived(this, e as RSTEventArgs); } } } }
private void StreamDataReceived(object sender, StreamDataEventArgs e) { ArrayList data = e.Data.ToObject <ArrayList>(); // insert timestamp to datastream data.Insert(0, e.Time); if (e.StreamName == "com") { OnComDataReceived(this, data); } }
/// <summary> /// Event handler for protocol data. /// </summary> /// <param name="sender">the sender object.</param> /// <param name="e">Event arguments.</param> private void OnProtocolData(object sender, StreamEventArgs e) { if (e.Stream == this) { if (Http2StreamState.Closed == e.Stream.State) { this.Close(StatusCode.ProtocolError); return; } if (e is HeadersEventArgs) { var args = (HeadersEventArgs)e; this.Headers.Merge(args.Headers); if (this.OnHeadersReceived != null) { this.OnHeadersReceived(this, args); } } else if (e is StreamDataEventArgs) { StreamDataEventArgs arg = e as StreamDataEventArgs; if (arg.IsFin && this.State == Http2StreamState.HalfClosed) { this.Close(); } if (this.OnDataReceived != null) { StreamDataEventArgs args = (StreamDataEventArgs)e; this.OnDataReceived(this, e as StreamDataEventArgs); //TODO incomment when server will be able to handle windowUpdate /*if (Session.IsFlowControlEnabled) * { * CurrentWindowBalanceFromServer -= args.Data.Data.Length; * if (CurrentWindowBalanceFromServer <= 0) * this.protocol.SendWindowUpdate(this, Session.CurrentWindowBalanceToServer); * }*/ } } else if (e is RSTEventArgs) { if (this.OnRSTReceived != null) { this.OnRSTReceived(this, e as RSTEventArgs); } } } }
/// <summary> /// Attached to events on protocol. /// </summary> /// <param name="smProtocol">Protocol.</param> private static void AttachProtocolEvents(SMProtocol smProtocol) { smProtocol.OnError += (s, e) => { _eventRaisedSmProtocol.Reset(); _isError = true; _eventRaisedSmProtocol.Set(); _eventRaisedStream.Set(); }; /* smProtocol.OnSessionFrame += (Object s, ControlFrameEventArgs e) => * { * eventRaisedSMProtocol.Reset(); * ControlFrame frame = e.Frame; * // isFinal and (State == HalfClose) MUST take the same values * if (frame.IsFinal ^ * (_session.GetStreamById(frame.StreamId).State == SMStreamState.HalfClosed)) * { * isError = true; * errorMessage = "Incorrect value Stream.State."; * * eventRaised.Set(); * } * eventRaisedSMProtocol.Set(); * };*/ smProtocol.OnStreamError += (s, e) => { _eventRaisedSmProtocol.Reset(); _isError = true; _errorMessage = "Internal stream error."; _eventRaisedSmProtocol.Set(); _eventRaisedStream.Set(); }; smProtocol.OnStreamFrame += (s, e) => { _eventRaisedSmProtocol.Reset(); if (e is HeadersEventArgs) { HeadersEventArgs headersEventArgs = e as HeadersEventArgs; if (headersEventArgs.Headers.Count == 0) { _isError = true; _errorMessage = "Incorrect value Frame.Headers.Count."; _eventRaisedStream.Set(); } } else if (e is StreamDataEventArgs) { StreamDataEventArgs streamDataEventArgs = e as StreamDataEventArgs; if (streamDataEventArgs.Data.Data.Length == 0) { _isError = true; _errorMessage = "Incorrect Data.Length."; _eventRaisedStream.Set(); } } else if (e is RSTEventArgs) { RSTEventArgs rstEventArgs = e as RSTEventArgs; if (rstEventArgs.Reason != StatusCode.Cancel) { _isError = true; _errorMessage = "Incorrect reason in RST frame."; _eventRaisedStream.Set(); } } _eventRaisedSmProtocol.Set(); }; }