예제 #1
0
        private static bool TryParsePartitioned(ChunkedStream input, out RpcPartitionedMessage message)
        {
            message = null;
            if (input == null || !input.CanRead)
            {
                return(false);
            }

            var inputDataLen = input.Length;

            if (inputDataLen < RpcMessageSizeOf.Header)
            {
                return(false);
            }

            var context = new ParserContext
            {
                Input        = input,
                InputLength  = inputDataLen,
                HeaderBuffer = RpcByteBufferCache.HeaderCache.Acquire()
            };

            try
            {
                context.Message = new RpcPartitionedMessage();

                var initialPosition = input.Position;
                input.Position = 0;
                try
                {
                    if (!ParseHeader(context))
                    {
                        return(false);
                    }

                    if (!ParseData(context))
                    {
                        return(false);
                    }
                }
                finally
                {
                    input.Position = initialPosition;
                }

                if (context.Completed)
                {
                    message = context.Message;
                    input.TrimLeft(context.StreamOffset);

                    return(true);
                }
            }
            finally
            {
                RpcByteBufferCache.HeaderCache.Release(context.HeaderBuffer);
            }

            return(false);
        }