Ejemplo n.º 1
0
        public override void Import(byte[] data, int start, int count)
        {
            HttpBody         body;
            int              blockSize;
            ByteArraySegment segment;

            while (count > 0)
            {
                if (mContentLength == null)
                {
                    if (mHeader == null)
                    {
                        mHeader = new HttpHeader(mHeaderBuffer);
                    }
                    if (mHeader.Import(data, ref start, ref count))
                    {
                        if (mHeader.Length == 0)
                        {
                            mReceiveMessage.Channel = this.Channel;
                            mReceiveMessage.Message = mHeader;
                            mHeader        = null;
                            mContentLength = null;
                            OnReceiveMessage(mReceiveMessage);
                            if (ReadSinglePackage)
                            {
                                BufferOffset = start;
                                BufferCount  = count;
                                break;
                            }
                        }
                        else
                        {
                            mContentLength          = mHeader.Length;
                            mReceiveMessage.Channel = this.Channel;
                            mReceiveMessage.Message = mHeader;

                            OnReceiveMessage(mReceiveMessage);
                            if (ReadSinglePackage)
                            {
                                BufferOffset = start;
                                BufferCount  = count;
                                break;
                            }
                        }
                    }
                }
                else
                {
                    body      = InstanceBodyData();
                    blockSize = (int)(mContentLength > BODY_BLOCK_SIZE ? BODY_BLOCK_SIZE : mContentLength);
                    blockSize = blockSize > count ? count : blockSize;
                    segment   = body.Data;
                    Buffer.BlockCopy(data, start, segment.Array, 0, blockSize);
                    count          -= blockSize;
                    mContentLength -= blockSize;
                    segment.SetInfo(0, blockSize);
                    body.Eof = mContentLength == 0;
                    if (body.Eof)
                    {
                        mContentLength = null;
                        mHeader        = null;
                    }
                    mReceiveMessage.Channel = this.Channel;
                    mReceiveMessage.Message = body;
                    OnReceiveMessage(mReceiveMessage);
                    if (ReadSinglePackage)
                    {
                        BufferOffset = start;
                        BufferCount  = count;
                        break;
                    }
                }
            }
        }