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); }
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); }
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); }
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); }
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<TRequestInfo>"/> 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); }
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); }
/// <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); }
/// <summary> /// Initializes a new instance of the <see cref="TerminatorRequestFilter<TRequestInfo>"/> class. /// </summary> /// <param name="terminator">The terminator.</param> public TerminatorRequestFilter(byte[] terminator) { m_SearchState = new SearchMarkState <byte>(terminator); }
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<TRequestInfo>"/> 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<TRequestInfo>"/> class. /// </summary> /// <param name="terminator">The terminator.</param> protected ChainTerminatorReceiveFilter(byte[] terminator) { m_SearchState = new SearchMarkState <byte>(terminator); }
public WebSocketHeaderReader(IAppServer server) : base(server) { m_SearchState = new SearchMarkState<byte>(m_HeaderTerminator); }
public HandshakeReader(WebSocket websocket) : base(websocket) { m_HeadSeachState = new SearchMarkState <byte>(HeaderTerminator); }
public HandshakeReader(WebSocket websocket) : base(websocket) { m_HeadSeachState = new SearchMarkState<byte>(HeaderTerminator); }
/// <summary> /// Initializes a new instance of the <see cref="TerminatorRequestFilter<TRequestInfo>"/> 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); }
/// <summary> /// Initializes a new instance of the <see cref="TerminatorReceiveFilter<TRequestInfo>"/> 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); }