Esempio n. 1
0
        public int SearchLastSegment(SearchMarkState <T> state)
        {
            if (this.m_Segments.Count <= 0)
            {
                return(-1);
            }
            ArraySegmentEx <T> segment = this.m_Segments[this.m_Segments.Count - 1];

            if (segment == null)
            {
                return(-1);
            }
            int?nullable = Extensions.SearchMark <T>((IList <T>)segment.Array, segment.Offset, segment.Count, state.Mark);

            if (!nullable.HasValue)
            {
                return(-1);
            }
            if (nullable.Value > 0)
            {
                state.Matched = 0;
                return(nullable.Value - segment.Offset + segment.From);
            }

            state.Matched = -nullable.Value;
            return(-1);
        }
Esempio n. 2
0
        public int SearchLastSegment(SearchMarkState <T> state)
        {
            if (m_Segments.Count <= 0)
            {
                return(-1);
            }

            var lastSegment = m_Segments[m_Segments.Count - 1];

            if (lastSegment == null)
            {
                return(-1);
            }

            var result = lastSegment.Array.SearchMark(lastSegment.Offset, lastSegment.Count, state.Mark);

            if (!result.HasValue)
            {
                return(-1);
            }

            if (result.Value > 0)
            {
                state.Matched = 0;
                return(result.Value - lastSegment.Offset + lastSegment.From);
            }

            state.Matched = 0 - result.Value;
            return(-1);
        }
        public int SearchLastSegment(SearchMarkState <T> state)
        {
            if (m_Segments.Count <= 0)
            {
                return(-1);
            }
            ArraySegmentEx <T> arraySegmentEx = m_Segments[m_Segments.Count - 1];

            if (arraySegmentEx == null)
            {
                return(-1);
            }
            int?num = arraySegmentEx.Array.SearchMark(arraySegmentEx.Offset, arraySegmentEx.Count, state.Mark);

            if (!num.HasValue)
            {
                return(-1);
            }
            if (num.Value > 0)
            {
                state.Matched = 0;
                return(num.Value - arraySegmentEx.Offset + arraySegmentEx.From);
            }
            state.Matched = -num.Value;
            return(-1);
        }
Esempio n. 4
0
 public TerminatorCommandReader(IAppServer appServer, Encoding encoding, byte[] terminator, ICommandParser commandParser)
     : this(appServer)
 {
     Encoding        = encoding;
     m_SearchState   = new SearchMarkState <byte>(terminator);
     m_CommandParser = commandParser;
 }
        public void TestMatchFirstTimeWithSearchMarkState()
        {
            byte[] first = Encoding.ASCII.GetBytes("HTTP/1.0 200 Connection Established\r\n\r\n");

            byte[] mark = Encoding.ASCII.GetBytes("\r\n\r\n");

            var searchState = new SearchMarkState <byte>(mark);

            // "\r\n\r\n" is matched at first[35] to [38]
            Assert.Equal(35, first.SearchMark(0, first.Length, searchState));
        }
        public void TestMatchSecondTimeWithSearchMarkState()
        {
            byte[] first  = Encoding.ASCII.GetBytes("HTTP/1.0 200 Connection Established\r\n");
            byte[] second = Encoding.ASCII.GetBytes("\r\n");

            byte[] mark = Encoding.ASCII.GetBytes("\r\n\r\n");

            var searchState = new SearchMarkState <byte>(mark);

            {
                // -1 means: not matched, or partially matched.
                Assert.Equal(-1, first.SearchMark(0, first.Length, searchState));

                // Check if (1 <= searchState.Matched) in case of partial match.
            }
            {
                var prevMatched = searchState.Matched;
                Assert.Equal(prevMatched, 2);

                // "\r\n\r\n" is completely matched on second buffer at second[0] to [1].
                Assert.Equal(0, second.SearchMark(0, second.Length, searchState));
            }
        }
 public WebSocketHeaderRequestFilter()
     : base()
 {
     m_SearchState = new SearchMarkState <byte>(m_HeaderTerminator);
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="CountSpliterReceiveFilter{TPackageInfo}"/> class.
 /// </summary>
 /// <param name="spliter">The spliter.</param>
 /// <param name="spliterCount">The spliter count.</param>
 protected CountSpliterReceiveFilter(byte[] spliter, int spliterCount)
 {
     m_SpliterSearchState = new SearchMarkState <byte>(spliter);
     m_SpliterCount       = spliterCount;
 }
 public WebSocketHeaderRequestFilter()
     : base()
 {
     m_SearchState = new SearchMarkState<byte>(m_HeaderTerminator);
 }
Esempio n. 10
0
        public static int SearchMark <T>(this IList <T> source, int offset, int length, SearchMarkState <T> searchState)
            where T : IEquatable <T>
        {
            int?result = source.SearchMark(offset, length, searchState.Mark, searchState.Matched);

            if (!result.HasValue)
            {
                searchState.Matched = 0;
                return(-1);
            }

            if (result.Value < 0)
            {
                searchState.Matched = 0 - result.Value;
                return(-1);
            }

            searchState.Matched = 0;
            return(result.Value);
        }
 public WebSocketHeaderReader(IAppServer server)
     : base(server)
 {
     m_SearchState = new SearchMarkState <byte>(m_HeaderTerminator);
 }
Esempio n. 12
0
 public BaseDataSyncReceiveFilter(byte[] beginMark, byte[] endMark)
 {
     m_BeginSearchState = new SearchMarkState <byte>(beginMark);
     m_EndSearchState   = new SearchMarkState <byte>(endMark);
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="BeginEndMarkReceiveFilter&lt;TRequestInfo&gt;"/> class.
 /// </summary>
 /// <param name="beginMark">The begin mark.</param>
 /// <param name="endMark">The end mark.</param>
 /// <param name="serviceProvider">A container for service objects.</param>
 protected BeginEndMarkReceiveFilter(byte[] beginMark, byte[] endMark, IServiceProvider serviceProvider)
     : base(serviceProvider)
 {
     m_BeginSearchState = new SearchMarkState <byte>(beginMark);
     m_EndSearchState   = new SearchMarkState <byte>(endMark);
 }
Esempio n. 14
0
 public GPSCommandReader(IAppServer appServer)
     : base(appServer)
 {
     m_StartSearchState = new SearchMarkState <byte>(m_StartMark);
     m_EndSearchState   = new SearchMarkState <byte>(m_EndMark);
 }
 public WebSocketHeaderRequestFilter(IWebSocketSession session)
     : base(session)
 {
     m_SearchState = new SearchMarkState<byte>(m_HeaderTerminator);
 }
Esempio n. 16
0
        /// <summary>
        /// 过滤指定的会话
        /// </summary>
        /// <param name="readBuffer">数据缓存</param>
        /// <param name="offset">数据起始位置</param>
        /// <param name="length">缓存长度</param>
        /// <param name="toBeCopied"></param>
        /// <param name="rest"></param>
        /// <returns></returns>
        public override TRequestInfo Filter(byte[] readBuffer, int offset, int length, bool toBeCopied, out int rest)
        {
            rest = 0;
            int searchEndMarkOffset;
            int searchEndMarkLength;

            //在此处做了处理,将接收到的第一个字符作为起始过滤标志,到结束。返回指定长度的数据。
            byte[] startMark = new byte[] { readBuffer[offset] };
            byte[] endMark   = new byte[] { 0xff };
            m_BeginSearchState = new SearchMarkState <byte>(startMark);
            m_EndSearchState   = new SearchMarkState <byte>(endMark);
            //上一个开始标记长度
            int prevMatched = 0;
            int totalParsed = 0;

            if (!m_FoundBegin)
            {
                prevMatched = m_BeginSearchState.Matched;
                int pos = readBuffer.SearchMark(offset, length, m_BeginSearchState, out totalParsed);

                if (pos < 0)
                {
                    //不要缓存无效数据
                    if (prevMatched > 0 || (m_BeginSearchState.Matched > 0 && length != m_BeginSearchState.Matched))
                    {
                        State = FilterState.Error;
                        return(NullRequestInfo);
                    }

                    return(NullRequestInfo);
                }
                else //找到匹配的开始标记
                {
                    //But not at the beginning
                    if (pos != offset)
                    {
                        State = FilterState.Error;
                        return(NullRequestInfo);
                    }
                }

                //找到开始标记
                m_FoundBegin = true;

                searchEndMarkOffset = pos + m_BeginSearchState.Mark.Length - prevMatched;

                //This block only contain (part of)begin mark
                if (offset + length <= searchEndMarkOffset)
                {
                    AddArraySegment(m_BeginSearchState.Mark, 0, m_BeginSearchState.Mark.Length, false);
                    return(NullRequestInfo);
                }

                searchEndMarkLength = offset + length - searchEndMarkOffset;
            }
            else//Already found begin mark
            {
                searchEndMarkOffset = offset;
                searchEndMarkLength = length;
            }

            while (true)
            {
                var prevEndMarkMatched = m_EndSearchState.Matched;
                var parsedLen          = 0;
                var endPos             = readBuffer.SearchMark(searchEndMarkOffset, searchEndMarkLength, m_EndSearchState, out parsedLen);

                //没有找到结束标记
                if (endPos < 0)
                {
                    rest = 0;
                    if (prevMatched > 0)//还缓存先前匹配的开始标记
                    {
                        AddArraySegment(m_BeginSearchState.Mark, 0, prevMatched, false);
                    }
                    AddArraySegment(readBuffer, offset, length, toBeCopied);
                }

                //totalParsed += parsedLen;
                //rest = length - totalParsed;
                totalParsed = 0;
                byte[] commandData = new byte[BufferSegments.Count + prevMatched + totalParsed];

                if (BufferSegments.Count > 0)
                {
                    BufferSegments.CopyTo(commandData, 0, 0, BufferSegments.Count);
                }

                if (prevMatched > 0)
                {
                    Array.Copy(m_BeginSearchState.Mark, 0, commandData, BufferSegments.Count, prevMatched);
                }

                Array.Copy(readBuffer, offset, commandData, BufferSegments.Count + prevMatched, totalParsed);

                var requestInfo = ProcessMatchedRequest(commandData, 0, commandData.Length);

                Reset();
                return(requestInfo);
            }
        }
 public WebSocketHeaderReceiveFilter(IWebSocketSession session)
     : base(session)
 {
     m_SearchState = new SearchMarkState <byte>(m_HeaderTerminator);
 }
Esempio n. 18
0
 /// <summary>
 /// Initializes a new instance of the <see cref="TerminatorRequestFilter&lt;TRequestInfo&gt;"/> class.
 /// </summary>
 /// <param name="terminator">The terminator.</param>
 public TerminatorRequestFilter(byte[] terminator)
 {
     m_SearchState = new SearchMarkState <byte>(terminator);
 }
Esempio n. 19
0
 public GPSRequestFilter()
 {
     m_StartSearchState = new SearchMarkState <byte>(m_StartMark);
     m_EndSearchState   = new SearchMarkState <byte>(m_EndMark);
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="BeginEndMarkReceiveFilter&lt;TRequestInfo&gt;"/> class.
 /// </summary>
 /// <param name="beginMark">The begin mark.</param>
 /// <param name="endMark">The end mark.</param>
 protected BeginEndMarkReceiveFilter(byte[] beginMark, byte[] endMark)
 {
     m_BeginSearchState = new SearchMarkState <byte>(beginMark);
     m_EndSearchState   = new SearchMarkState <byte>(endMark);
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="TerminatorReceiveFilter&lt;TRequestInfo&gt;"/> class.
 /// </summary>
 /// <param name="terminator">The terminator.</param>
 protected ChainTerminatorReceiveFilter(byte[] terminator)
 {
     m_SearchState = new SearchMarkState <byte>(terminator);
 }
Esempio n. 22
0
 public WebSocketHeaderReader(IAppServer server)
     : base(server)
 {
     m_SearchState = new SearchMarkState<byte>(m_HeaderTerminator);
 }
Esempio n. 23
0
 public HandshakeReader(WebSocket websocket)
     : base(websocket)
 {
     m_HeadSeachState = new SearchMarkState <byte>(HeaderTerminator);
 }
Esempio n. 24
0
 public HandshakeReader(WebSocket websocket)
     : base(websocket)
 {
     m_HeadSeachState = new SearchMarkState<byte>(HeaderTerminator);
 }
Esempio n. 25
0
 /// <summary>
 /// Initializes a new instance of the <see cref="TerminatorRequestFilter&lt;TRequestInfo&gt;"/> class.
 /// </summary>
 /// <param name="session">The session.</param>
 /// <param name="terminator">The terminator.</param>
 protected TerminatorRequestFilter(IAppSession session, byte[] terminator)
 {
     m_Session     = session;
     m_SearchState = new SearchMarkState <byte>(terminator);
 }
Esempio n. 26
0
 /// <summary>
 /// Initializes a new instance of the <see cref="TerminatorReceiveFilter&lt;TRequestInfo&gt;"/> class.
 /// </summary>
 /// <param name="terminator">The terminator.</param>
 /// <param name="serviceProvider">A container for service objects.</param>
 protected TerminatorReceiveFilter(byte[] terminator, IServiceProvider serviceProvider)
     : base(serviceProvider)
 {
     m_SearchState = new SearchMarkState <byte>(terminator);
 }