public void TestIndexAccess()
        {
            ArraySegmentList <char> source = new ArraySegmentList <char>();

            source.AddSegment("I love you,".ToCharArray(), 0, 5);
            source.AddSegment("Hello world!".ToCharArray(), 0, 4);

            char[] exptected = "I lovHell".ToCharArray();

            for (int i = source.Count - 1; i >= 0; i--)
            {
                Assert.AreEqual(exptected[i], source[i]);
            }

            for (int i = 0; i < source.Count; i++)
            {
                Assert.AreEqual(exptected[i], source[i]);
            }

            source.RemoveSegmentAt(0);
            source.RemoveSegmentAt(0);

            source.AddSegment("I love you,".ToCharArray(), 0, 5);
            source.AddSegment("Hello world!".ToCharArray(), 0, 4);

            for (int i = 0; i < source.Count; i++)
            {
                Assert.AreEqual(exptected[i], source[i], i + " is expected!");
            }
        }
示例#2
0
        public void TestIndexAccess()
        {
            ArraySegmentList<char> source = new ArraySegmentList<char>();

            source.AddSegment("I love you,".ToCharArray(), 0, 5);
            source.AddSegment("Hello world!".ToCharArray(), 0, 4);

            char[] exptected = "I lovHell".ToCharArray();

            for (int i = source.Count - 1; i >= 0; i--)
            {
                Assert.AreEqual(exptected[i], source[i]);
            }

            for (int i = 0; i < source.Count; i++)
            {
                Assert.AreEqual(exptected[i], source[i]);
            }

            source.RemoveSegmentAt(0);
            source.RemoveSegmentAt(0);

            source.AddSegment("I love you,".ToCharArray(), 0, 5);
            source.AddSegment("Hello world!".ToCharArray(), 0, 4);

            for (int i = 0; i < source.Count; i++)
            {
                Assert.AreEqual(exptected[i], source[i], i + " is expected!");
            }
        }
        public void TestEndsWith()
        {
            ArraySegmentList <char> source = new ArraySegmentList <char>();

            source.AddSegment("I love you,".ToCharArray(), 0, 5);
            source.AddSegment("Hello world!".ToCharArray(), 0, 4);

            Assert.AreEqual(true, source.EndsWith("Hell".ToCharArray()));
        }
        public void TestToArray()
        {
            ArraySegmentList <char> source = new ArraySegmentList <char>();

            source.AddSegment("I love you,".ToCharArray(), 0, 5);
            source.AddSegment("Hello world!".ToCharArray(), 0, 4);

            char[] exptected = "I lovHell".ToCharArray();

            Assert.AreEqual(exptected, source.ToArrayData());
            Assert.AreEqual("He", new string(source.ToArrayData(5, 2)));
            Assert.AreEqual("ovHe", new string(source.ToArrayData(3, 4)));
        }
        public void TestIndexOf()
        {
            ArraySegmentList <char> source = new ArraySegmentList <char>();

            source.AddSegment("I love you,".ToCharArray(), 3, 7);
            source.AddSegment("Hello world!".ToCharArray(), 0, 4);

            //string exptected = "ove youHell";
            Assert.AreEqual(-1, source.IndexOf('I'));
            Assert.AreEqual(9, source.IndexOf('l'));
            Assert.AreEqual(0, source.IndexOf('o'));
            Assert.AreEqual(1, source.IndexOf('v'));
        }
示例#6
0
        public void TestIndexAccess2()
        {
            ArraySegmentList <char> sourceA = new ArraySegmentList <char>();
            List <char>             sourceB = new List <char>();

            char[] element = null;

            for (var i = 0; i < 100; i++)
            {
                element = Guid.NewGuid().ToString().ToCharArray();
                sourceA.AddSegment(element, 0, element.Length);
                sourceB.AddRange(element);
            }

            Random rd = new Random();

            for (int i = 0; i < 1000; i++)
            {
                int index = rd.Next(0, sourceA.Count - 1);
                Assert.AreEqual(sourceB[index], sourceA[index]);
            }

            int testCount = 10000;

            GC.Collect();

            Stopwatch watch = new Stopwatch();

            watch.Start();

            char tt = ' ';

            for (var i = 0; i < testCount; i++)
            {
                int index = rd.Next(0, sourceA.Count - 1);
                tt = sourceA[index];
            }

            watch.Stop();

            Console.WriteLine(watch.ElapsedMilliseconds);

            watch.Reset();

            GC.Collect();

            watch.Start();

            for (var i = 0; i < testCount; i++)
            {
                int index = rd.Next(0, sourceA.Count - 1);
                tt = sourceB[index];
            }

            Console.Write(tt);

            watch.Stop();

            Console.WriteLine(watch.ElapsedMilliseconds);
        }
        public void TestDecodeMaskPerformance()
        {
            ArraySegmentList source = new ArraySegmentList();

            for (var i = 0; i < 100; i++)
            {
                var element = Encoding.UTF8.GetBytes(Guid.NewGuid().ToString());
                source.AddSegment(element, 0, element.Length);
            }

            byte[] mask = new byte[] { source[5], source[100], source[150], source[200] };

            int testCount = 1000;

            GC.Collect();

            Stopwatch watch = new Stopwatch();

            watch.Start();

            for (var i = 0; i < testCount; i++)
            {
                source.DecodeMask(mask, 100, source.Count - 100);
            }

            watch.Stop();

            Console.WriteLine(watch.ElapsedMilliseconds);

            watch.Reset();

            GC.Collect();

            watch.Start();

            for (var i = 0; i < testCount; i++)
            {
                var data = source.ToArrayData(100, source.Count - 100);
                DecodeMask(data, mask, 0, data.Length);
            }

            watch.Stop();

            Console.WriteLine(watch.ElapsedMilliseconds);

            watch.Reset();

            GC.Collect();

            watch.Start();

            for (var i = 0; i < testCount; i++)
            {
                DecodeMask(source, mask, 100, source.Count - 100);
            }

            watch.Stop();

            Console.WriteLine(watch.ElapsedMilliseconds);
        }
示例#8
0
 protected void AddArraySegment(
     ArraySegmentList segments,
     byte[] buffer,
     int offset,
     int length,
     bool isReusableBuffer)
 {
     segments.AddSegment(buffer, offset, length, isReusableBuffer);
 }
        private void AddSegment(byte[] segment, int offset, int length, bool toBeCopied)
        {
            if (m_Buffer == null)
            {
                m_Buffer = new ArraySegmentList();
            }

            m_Buffer.AddSegment(segment, offset, length, toBeCopied);
        }
示例#10
0
        public void TestCount()
        {
            ArraySegmentList <char> source = new ArraySegmentList <char>();

            source.AddSegment("I love you,".ToCharArray(), 0, 5);
            source.AddSegment("Hello world!".ToCharArray(), 0, 4);

            Assert.AreEqual(9, source.Count);

            source.RemoveSegmentAt(0);
            Assert.AreEqual(4, source.Count);

            source.RemoveSegmentAt(0);
            Assert.AreEqual(0, source.Count);

            source.AddSegment("I love you,".ToCharArray(), 0, 5);
            source.AddSegment("Hello world!".ToCharArray(), 0, 4);

            Assert.AreEqual(9, source.Count);
        }
示例#11
0
        public void TestRemoveSegment()
        {
            ArraySegmentList <char> source = new ArraySegmentList <char>();

            source.AddSegment(new ArraySegment <char>("I love you,".ToCharArray(), 0, 5));
            source.AddSegment(new ArraySegment <char>("Hello world!".ToCharArray(), 0, 4));
            Assert.AreEqual(9, source.Count);
            Assert.AreEqual(2, source.SegmentCount);

            source.RemoveSegmentAt(1);
            Assert.AreEqual(5, source.Count);
            Assert.AreEqual(1, source.SegmentCount);

            char[] exptected = "I lov".ToCharArray();

            for (var i = 0; i < exptected.Length; i++)
            {
                Assert.AreEqual(exptected[i], source[i]);
            }
        }
示例#12
0
        public void TestCount()
        {
            ArraySegmentList<char> source = new ArraySegmentList<char>();

            source.AddSegment("I love you,".ToCharArray(), 0, 5);
            source.AddSegment("Hello world!".ToCharArray(), 0, 4);

            Assert.AreEqual(9, source.Count);

            source.RemoveSegmentAt(0);
            Assert.AreEqual(4, source.Count);

            source.RemoveSegmentAt(0);
            Assert.AreEqual(0, source.Count);

            source.AddSegment("I love you,".ToCharArray(), 0, 5);
            source.AddSegment("Hello world!".ToCharArray(), 0, 4);

            Assert.AreEqual(9, source.Count);
        }
示例#13
0
        public void TestOutOfIndex()
        {
            ArraySegmentList<char> source = new ArraySegmentList<char>();

            source.AddSegment("I love you,".ToCharArray(), 0, 5);
            source.AddSegment("Hello world!".ToCharArray(), 0, 4);
            
            char currentChar = ' ';

            Assert.Throws<IndexOutOfRangeException>(delegate
            {
                currentChar = source[-1];
            });

            Assert.Throws<IndexOutOfRangeException>(delegate
            {
                currentChar = source[10];
            });

            source.RemoveSegmentAt(0);
            Assert.Throws<IndexOutOfRangeException>(delegate
            {
                currentChar = source[4];
            });

            source.RemoveSegmentAt(0);
            Assert.Throws<IndexOutOfRangeException>(delegate
            {
                currentChar = source[0];
            });

            source.AddSegment("I love you,".ToCharArray(), 0, 5);
            source.AddSegment("Hello world!".ToCharArray(), 0, 4);

            Assert.Throws<IndexOutOfRangeException>(delegate
            {
                currentChar = source[10];
            });
            
            Console.Write(currentChar);
        }
示例#14
0
        public void TestOutOfIndex()
        {
            ArraySegmentList <char> source = new ArraySegmentList <char>();

            source.AddSegment("I love you,".ToCharArray(), 0, 5);
            source.AddSegment("Hello world!".ToCharArray(), 0, 4);

            char currentChar = ' ';

            Assert.Throws <IndexOutOfRangeException>(delegate
            {
                currentChar = source[-1];
            });

            Assert.Throws <IndexOutOfRangeException>(delegate
            {
                currentChar = source[10];
            });

            source.RemoveSegmentAt(0);
            Assert.Throws <IndexOutOfRangeException>(delegate
            {
                currentChar = source[4];
            });

            source.RemoveSegmentAt(0);
            Assert.Throws <IndexOutOfRangeException>(delegate
            {
                currentChar = source[0];
            });

            source.AddSegment("I love you,".ToCharArray(), 0, 5);
            source.AddSegment("Hello world!".ToCharArray(), 0, 4);

            Assert.Throws <IndexOutOfRangeException>(delegate
            {
                currentChar = source[10];
            });

            Console.Write(currentChar);
        }
        public void TestAddSegment()
        {
            ArraySegmentList<char> source = new ArraySegmentList<char>();

            Assert.AreEqual(0, source.Count);

            source.AddSegment("I love you,".ToCharArray(), 0, 5);
            Assert.AreEqual(5, source.Count);
            Assert.AreEqual(1, source.SegmentCount);

            source.AddSegment("Hello world!".ToCharArray(), 0, 4);
            Assert.AreEqual(9, source.Count);
            Assert.AreEqual(2, source.SegmentCount);

            char[] exptected = "I lovHell".ToCharArray();

            for (var i = 0; i < exptected.Length; i++)
            {
                Assert.AreEqual(exptected[i], source[i]);
            }
        }
示例#16
0
        public void TestOutOfIndex()
        {
            ArraySegmentList <char> source = new ArraySegmentList <char>(new List <ArraySegment <char> >
            {
                new ArraySegment <char>("I love you,".ToCharArray(), 0, 5),
                new ArraySegment <char>("Hello world!".ToCharArray(), 0, 4)
            });

            Assert.Throws <IndexOutOfRangeException>(delegate
            {
                char currentChar = source[-1];
            });

            Assert.Throws <IndexOutOfRangeException>(delegate
            {
                char currentChar = source[10];
            });

            source.RemoveSegmentAt(0);
            Assert.Throws <IndexOutOfRangeException>(delegate
            {
                char currentChar = source[4];
            });

            source.RemoveSegmentAt(0);
            Assert.Throws <IndexOutOfRangeException>(delegate
            {
                char currentChar = source[0];
            });

            source.AddSegment(new ArraySegment <char>("I love you,".ToCharArray(), 0, 5));
            source.AddSegment(new ArraySegment <char>("Hello world!".ToCharArray(), 0, 4));

            Assert.Throws <IndexOutOfRangeException>(delegate
            {
                char currentChar = source[10];
            });
        }
示例#17
0
        public void TestDecode()
        {
            ArraySegmentList source = new ArraySegmentList();

            StringBuilder sb = new StringBuilder();

            List <int> countArray = new List <int>();

            int from, to;

            Random rd = new Random();

            from = rd.Next(0, 19);
            to   = rd.Next(from + 1, 20);

            for (var i = 0; i < 20; i++)
            {
                var line    = Guid.NewGuid().ToString();
                var element = Encoding.UTF8.GetBytes(line);

                if (i >= from && i <= to)
                {
                    countArray.Add(source.Count);
                    Console.WriteLine(source.Count);
                    sb.Append(line);
                    source.AddSegment(element, 0, element.Length);
                    countArray.Add(source.Count);
                    Console.WriteLine(source.Count);
                }
                else
                {
                    source.AddSegment(element, 0, element.Length);
                }
            }

            Assert.AreEqual(sb.ToString(), source.Decode(Encoding.UTF8, countArray[0], countArray[countArray.Count - 1] - countArray[0]));
        }
示例#18
0
        public void TestSearchPerformance()
        {
            ArraySegmentList <char> sourceA = new ArraySegmentList <char>();
            List <char>             sourceB = new List <char>();

            char[] element = null;

            for (var i = 0; i < 100; i++)
            {
                element = Guid.NewGuid().ToString().ToCharArray();
                sourceA.AddSegment(element, 0, element.Length);
                sourceB.AddRange(element);
            }

            char[] mark = element.Take(4).ToArray();

            int testCount = 1000;

            GC.Collect();

            Stopwatch watch = new Stopwatch();

            watch.Start();

            for (var i = 0; i < testCount; i++)
            {
                sourceA.SearchMark(mark);
            }

            watch.Stop();

            Console.WriteLine(watch.ElapsedMilliseconds);

            watch.Reset();

            GC.Collect();

            watch.Start();

            for (var i = 0; i < testCount; i++)
            {
                sourceB.SearchMark(mark);
            }

            watch.Stop();

            Console.WriteLine(watch.ElapsedMilliseconds);
        }
        protected void ReceiveMessage(Stream stream, ArraySegmentList commandBuffer, int predictCount)
        {
            byte[] buffer = new byte[1024];
            int thisRead = 0;
            int left = predictCount;

            while ((thisRead = stream.Read(buffer, 0, Math.Min(left, buffer.Length))) > 0)
            {
                Console.WriteLine("Current read: {0}", thisRead);
                commandBuffer.AddSegment(buffer, 0, thisRead, true);
                left -= thisRead;

                if (left <= 0)
                    break;
            }
        }
示例#20
0
        protected void ReceiveMessage(Stream stream, ArraySegmentList commandBuffer, int predictCount)
        {
            byte[] buffer = new byte[1024];
            int thisRead = 0;
            int left = predictCount;

            while ((thisRead = stream.Read(buffer, 0, Math.Min(left, buffer.Length))) > 0)
            {
                Console.WriteLine("Current read: {0}", thisRead);
                commandBuffer.AddSegment(buffer, 0, thisRead, true);
                left -= thisRead;

                if (left <= 0)
                    break;
            }
        }
        /// <summary>
        /// Filters the specified session.
        /// </summary>
        /// <param name="session">The session.</param>
        /// <param name="readBuffer">The read buffer.</param>
        /// <param name="offset">The offset.</param>
        /// <param name="length">The length.</param>
        /// <param name="toBeCopied">if set to <c>true</c> [to be copied].</param>
        /// <param name="left">The left.</param>
        /// <returns></returns>
        public override TRequestInfo Filter(IAppSession <TRequestInfo> session, byte[] readBuffer, int offset, int length, bool toBeCopied, out int left)
        {
            if (!m_FoundHeader)
            {
                return(base.Filter(session, readBuffer, offset, length, toBeCopied, out left));
            }

            if (m_BodyBuffer == null || m_BodyBuffer.Count == 0)
            {
                if (length < m_BodyLength)
                {
                    if (m_BodyBuffer == null)
                    {
                        m_BodyBuffer = new ArraySegmentList();
                    }

                    m_BodyBuffer.AddSegment(readBuffer, offset, length, toBeCopied);
                    left = 0;
                    return(default(TRequestInfo));
                }
                else if (length == m_BodyLength)
                {
                    left          = 0;
                    m_FoundHeader = false;
                    return(ResolveRequestData(m_Header, readBuffer, offset, length));
                }
                else
                {
                    left          = length - m_BodyLength;
                    m_FoundHeader = false;
                    return(ResolveRequestData(m_Header, readBuffer, offset, m_BodyLength));
                }
            }
            else
            {
                int required = m_BodyLength - m_BodyBuffer.Count;

                if (length < required)
                {
                    m_BodyBuffer.AddSegment(readBuffer, offset, length, toBeCopied);
                    left = 0;
                    return(default(TRequestInfo));
                }
                else if (length == required)
                {
                    m_BodyBuffer.AddSegment(readBuffer, offset, length, toBeCopied);
                    left          = 0;
                    m_FoundHeader = false;
                    var requestInfo = ResolveRequestData(m_Header, m_BodyBuffer.ToArrayData());
                    m_BodyBuffer.ClearSegements();
                    return(requestInfo);
                }
                else
                {
                    m_BodyBuffer.AddSegment(readBuffer, offset, required, toBeCopied);
                    left          = length - required;
                    m_FoundHeader = false;
                    var requestInfo = ResolveRequestData(m_Header, m_BodyBuffer.ToArrayData(0, m_BodyLength));
                    m_BodyBuffer.ClearSegements();
                    return(requestInfo);
                }
            }
        }
示例#22
0
        public void TestDecodeMaskPerformance()
        {
            ArraySegmentList source = new ArraySegmentList();

            for (var i = 0; i < 100; i++)
            {
                var element = Encoding.UTF8.GetBytes(Guid.NewGuid().ToString());
                source.AddSegment(element, 0, element.Length);
            }

            byte[] mask = new byte[] { source[5], source[100], source[150], source[200] };

            int testCount = 1000;

            GC.Collect();

            Stopwatch watch = new Stopwatch();

            watch.Start();

            for (var i = 0; i < testCount; i++)
            {
                source.DecodeMask(mask, 100, source.Count - 100);
            }

            watch.Stop();

            Console.WriteLine(watch.ElapsedMilliseconds);

            watch.Reset();

            GC.Collect();

            watch.Start();

            for (var i = 0; i < testCount; i++)
            {
                var data = source.ToArrayData(100, source.Count - 100);
                DecodeMask(data, mask, 0, data.Length);
            }

            watch.Stop();

            Console.WriteLine(watch.ElapsedMilliseconds);

            watch.Reset();

            GC.Collect();

            watch.Start();

            for (var i = 0; i < testCount; i++)
            {
                DecodeMask(source, mask, 100, source.Count - 100);
            }

            watch.Stop();

            Console.WriteLine(watch.ElapsedMilliseconds);
        }
示例#23
0
        public void TestDecode()
        {
            ArraySegmentList source = new ArraySegmentList();

            StringBuilder sb = new StringBuilder();

            List<int> countArray = new List<int>();

            int from, to;

            Random rd = new Random();

            from = rd.Next(0, 19);
            to = rd.Next(from + 1, 20);

            for (var i = 0; i < 20; i++)
            {
                var line = Guid.NewGuid().ToString();
                var element = Encoding.UTF8.GetBytes(line);

                if (i >= from && i <= to)
                {
                    countArray.Add(source.Count);
                    Console.WriteLine(source.Count);
                    sb.Append(line);
                    source.AddSegment(element, 0, element.Length);
                    countArray.Add(source.Count);
                    Console.WriteLine(source.Count);
                }
                else
                {
                    source.AddSegment(element, 0, element.Length);
                }
            }

            Assert.AreEqual(sb.ToString(), source.Decode(Encoding.UTF8, countArray[0], countArray[countArray.Count - 1] - countArray[0]));
        }
示例#24
0
        public void TestSearchPerformance()
        {
            ArraySegmentList<char> sourceA = new ArraySegmentList<char>();
            List<char> sourceB = new List<char>();

            char[] element = null;

            for (var i = 0; i < 100; i++)
            {
                element = Guid.NewGuid().ToString().ToCharArray();
                sourceA.AddSegment(element, 0, element.Length);
                sourceB.AddRange(element);
            }

            char[] mark = element.Take(4).ToArray();

            int testCount = 1000;

            GC.Collect();

            Stopwatch watch = new Stopwatch();

            watch.Start();

            for (var i = 0; i < testCount; i++)
            {
                sourceA.SearchMark(mark);
            }

            watch.Stop();
            
            Console.WriteLine(watch.ElapsedMilliseconds);

            watch.Reset();

            GC.Collect();

            watch.Start();

            for (var i = 0; i < testCount; i++)
            {
                sourceB.SearchMark(mark);
            }

            watch.Stop();

            Console.WriteLine(watch.ElapsedMilliseconds);
        }
示例#25
0
        public void TestToArray()
        {
            ArraySegmentList<char> source = new ArraySegmentList<char>();

            source.AddSegment("I love you,".ToCharArray(), 0, 5);
            source.AddSegment("Hello world!".ToCharArray(), 0, 4);

            char[] exptected = "I lovHell".ToCharArray();

            Assert.AreEqual(exptected, source.ToArrayData());
            Assert.AreEqual("He", new string(source.ToArrayData(5, 2)));
            Assert.AreEqual("ovHe", new string(source.ToArrayData(3, 4)));
        }
示例#26
0
        public void TestEndsWith()
        {
            ArraySegmentList<char> source = new ArraySegmentList<char>();

            source.AddSegment("I love you,".ToCharArray(), 0, 5);
            source.AddSegment("Hello world!".ToCharArray(), 0, 4);

            Assert.AreEqual(true, source.EndsWith("Hell".ToCharArray()));
        }
示例#27
0
        public void TestIndexOf()
        {
            ArraySegmentList<char> source = new ArraySegmentList<char>();

            source.AddSegment("I love you,".ToCharArray(), 3, 7);
            source.AddSegment("Hello world!".ToCharArray(), 0, 4);

            //string exptected = "ove youHell";
            Assert.AreEqual(-1, source.IndexOf('I'));
            Assert.AreEqual(9, source.IndexOf('l'));
            Assert.AreEqual(0, source.IndexOf('o'));
            Assert.AreEqual(1, source.IndexOf('v'));
        }
示例#28
0
        public void TestIndexAccess2()
        {
            ArraySegmentList<char> sourceA = new ArraySegmentList<char>();
            List<char> sourceB = new List<char>();

            char[] element = null;

            for (var i = 0; i < 100; i++)
            {
                element = Guid.NewGuid().ToString().ToCharArray();
                sourceA.AddSegment(element, 0, element.Length);
                sourceB.AddRange(element);
            }

            Random rd = new Random();

            for (int i = 0; i < 1000; i++)
            {
                int index = rd.Next(0, sourceA.Count - 1);
                Assert.AreEqual(sourceB[index], sourceA[index]);
            }

            int testCount = 10000;

            GC.Collect();

            Stopwatch watch = new Stopwatch();

            watch.Start();

            for (var i = 0; i < testCount; i++)
            {
                int index = rd.Next(0, sourceA.Count - 1);
                var tt = sourceA[index];
            }

            watch.Stop();

            Console.WriteLine(watch.ElapsedMilliseconds);

            watch.Reset();

            GC.Collect();

            watch.Start();

            for (var i = 0; i < testCount; i++)
            {
                int index = rd.Next(0, sourceA.Count - 1);
                var tt = sourceB[index];
            }

            watch.Stop();

            Console.WriteLine(watch.ElapsedMilliseconds);
        }
示例#29
0
 protected void AddArraySegment(ArraySegmentList segments, byte[] buffer, int offset, int length, bool toBeCopied)
 {
     segments.AddSegment(buffer, offset, length, toBeCopied);
 }
        /// <summary>
        /// Filters the specified session.
        /// </summary>
        /// <param name="readBuffer">The read buffer.</param>
        /// <param name="offset">The offset.</param>
        /// <param name="length">The length.</param>
        /// <param name="toBeCopied">if set to <c>true</c> [to be copied].</param>
        /// <param name="rest">The rest.</param>
        /// <returns></returns>
        public override TRequestInfo Filter(byte[] readBuffer, int offset, int length, bool toBeCopied, out int rest)
        {
//             byte[] m_Request = new byte[length];
//             System.Buffer.BlockCopy(m_Request, 0, readBuffer, offset, length
            if (!m_FoundHeader)
            {
                return(base.Filter(readBuffer, offset, length, toBeCopied, out rest));
            }

            if (m_BodyBuffer == null || m_BodyBuffer.Count == 0)
            {
                if (length < m_BodyLength)
                {
                    if (m_BodyBuffer == null)
                    {
                        m_BodyBuffer = new ArraySegmentList();
                    }

                    m_BodyBuffer.AddSegment(readBuffer, offset, length, toBeCopied);
                    rest = 0;
                    return(NullRequestInfo);
                }
                else if (length == m_BodyLength)
                {
                    rest          = 0;
                    m_FoundHeader = false;
                    return(ResolveRequestInfo(m_Header, readBuffer, offset, length));
                }
                else
                {
                    rest          = length - m_BodyLength;
                    m_FoundHeader = false;
                    return(ResolveRequestInfo(m_Header, readBuffer, offset, m_BodyLength));
                }
            }
            else
            {
                int required = m_BodyLength - m_BodyBuffer.Count;

                if (length < required)
                {
                    m_BodyBuffer.AddSegment(readBuffer, offset, length, toBeCopied);
                    rest = 0;
                    return(NullRequestInfo);
                }
                else if (length == required)
                {
                    m_BodyBuffer.AddSegment(readBuffer, offset, length, toBeCopied);
                    rest          = 0;
                    m_FoundHeader = false;
                    var requestInfo = ResolveRequestInfo(m_Header, m_BodyBuffer.ToArrayData());
                    m_BodyBuffer.ClearSegements();
                    return(requestInfo);
                }
                else
                {
                    m_BodyBuffer.AddSegment(readBuffer, offset, required, toBeCopied);
                    rest          = length - required;
                    m_FoundHeader = false;
                    var requestInfo = ResolveRequestInfo(m_Header, m_BodyBuffer.ToArrayData(0, m_BodyLength));
                    m_BodyBuffer.ClearSegements();
                    return(requestInfo);
                }
            }
        }