예제 #1
0
        private static bool ParseData(ParserContext context)
        {
            if (context.InputLength <= 0)
            {
                return(false);
            }

            var ctxMessage = context.Message;

            var dataLen = ctxMessage.Header.DataSize;

            if (dataLen < 0)
            {
                throw new Exception(RpcErrors.InvalidMessage);
            }

            if (dataLen == 0)
            {
                context.Completed = true;
                return(true);
            }

            if (context.InputLength >= dataLen)
            {
                var dataStream = new ChunkedStream();
                try
                {
                    var readLen = dataStream.ReadFrom(context.Input, dataLen);
                    if (readLen < dataLen)
                    {
                        dataStream.Dispose();
                        return(false);
                    }

                    context.InputLength  -= dataLen;
                    context.StreamOffset += dataLen;

                    ctxMessage.Data = dataStream;

                    context.Completed = true;
                    return(true);
                }
                catch (Exception)
                {
                    dataStream.Dispose();
                }
            }
            return(false);
        }
예제 #2
0
        private bool Write(ChunkedStream outStream, WireMessage[] messages, bool flush = true)
        {
            ThrowIfDisposed();

            if (outStream == null)
            {
                return(false);
            }

            using (var dataStream = new ChunkedStream())
            {
                try
                {
                    var dataSize = (int)_serializer.Serialize(messages, dataStream);
                    if (dataSize > RpcMessageSizeOf.MaxAllowedData)
                    {
                        return(false);
                    }

                    /* Header */
                    WriteHeader(outStream, dataSize, out byte[] messageId);

                    if (dataSize == 0)
                    {
                        return(true);
                    }

                    dataStream.Position = 0;
                    outStream.ReadFrom(dataStream, dataSize);

                    /* var buffer = ByteArrayCache.Default.Acquire();
                     * try
                     * {
                     *  var bufferLen = buffer.Length;
                     *
                     *  using (var dataReader = dataStream.NewReader(0))
                     *  {
                     *      var readLen = 0;
                     *      while (dataSize > 0)
                     *      {
                     *          readLen = dataReader.Read(buffer, 0, bufferLen);
                     *
                     *          readLen = Math.Max(0, readLen);
                     *          if (readLen > 0)
                     *          {
                     *              dataSize -= readLen;
                     *              bufferLen = Math.Min(bufferLen, dataSize);
                     *
                     *              outStream.Write(buffer, 0, readLen);
                     *          }
                     *      }
                     *  }
                     * }
                     * finally
                     * {
                     *  ByteArrayCache.Default.Release(buffer);
                     * } */
                }
                finally
                {
                    if (flush)
                    {
                        outStream.Flush();
                    }
                }
            }
            return(true);
        }