Example #1
0
        public static RedisMessage FromBytes(IMessageEncryptor encryptor, byte[] data, TraceSource trace)
        {
            using (var stream = new MemoryStream(data))
            {
                var message = new RedisMessage();

                // read message id from memory stream until SPACE character
                var messageIdBuilder = new StringBuilder(20);
                do
                {
                    // it is safe to read digits as bytes because they encoded by single byte in UTF-8
                    int charCode = stream.ReadByte();
                    if (charCode == -1)
                    {
                        trace.TraceVerbose("Received Message could not be parsed.");
                        throw new EndOfStreamException(Resources.Error_EndOfStreamRedis);
                    }

                    char c = (char)charCode;

                    if (c == ' ')
                    {
                        message.Id       = ulong.Parse(messageIdBuilder.ToString(), CultureInfo.InvariantCulture);
                        messageIdBuilder = null;
                    }
                    else
                    {
                        messageIdBuilder.Append(c);
                    }
                }while (messageIdBuilder != null);


                var encryptedBinaryReader = new BinaryReader(stream);
                var encryptedData         = encryptedBinaryReader.ReadBytes((int)(stream.Length - stream.Position));
                var decryptedData         = encryptor.Decrypt(encryptedData);

                using (var dataStream = new MemoryStream(decryptedData))
                    using (var decryptedReader = new BinaryReader(dataStream))
                    {
                        int    count  = decryptedReader.ReadInt32();
                        byte[] buffer = decryptedReader.ReadBytes(count);

                        message.ScaleoutMessage = ScaleoutMessage.FromBytes(buffer);
                    }

                return(message);
            }
        }