示例#1
0
        /// <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);
                    }
                }
            }
        }
示例#2
0
        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();
            };
        }