Beispiel #1
0
        public override void ReceiveChunk(byte[] buffer, int offset, int length)
        {
            if (lastState == ParserStatus.EOF)
            {
                throw new EndOfStreamException();
            }
            if (offset + length >= buffer.Length)
            {
                throw new IndexOutOfRangeException();
            }
            if (lastState == ParserStatus.MOVE_NEXT_SAME_BUFFER)
            {
                // We have unprocess data in previous buffer.
                parser.BufferOffset = StartPtr;
                lastState           = parser.ProcessBuffer(connection.ConnectionBuffer, HttpConnection.BUFFER_SIZE, length);
                StartPtr            = parser.BufferOffset;

                if (lastState == ParserStatus.MOVE_NEXT)
                {
                    byte[] result = parser.Content;
                    Array.Copy(result, 0, buffer, offset, result.Length);
                    parser.ResetParser();
                }
            }
            else
            {
                lastState = ParserStatus.REQUIRE_MORE;
                int size = 0;
                while (lastState == ParserStatus.REQUIRE_MORE)
                {
                    size      = connection.ActiveSocket.Receive(connection.ConnectionBuffer);
                    lastState = parser.ProcessBuffer(connection.ConnectionBuffer, size, length);
                }
                if (lastState.HasFlag(ParserStatus.MOVE_NEXT) || lastState == ParserStatus.EOF)
                {
                    Array.Copy(parser.Content, 0, buffer, offset, length);
                    if (lastState == ParserStatus.EOF)
                    {
                        // Put connection back to normal listening mode
                        connection.ActiveSocket.BeginReceive(
                            connection.ConnectionBuffer, 0, HttpConnection.BUFFER_SIZE, 0,
                            new AsyncCallback(connection.ConnectionHandler.ReadCallback),
                            connection);
                    }
                }
                else if (lastState == ParserStatus.ERROR)
                {
                    connection.Response.SendError(System.Net.HttpStatusCode.NotImplemented);
                    throw new InvalidDataException();
                }

                parser.ResetParser();
            }
        }