/// <summary>
        /// Reads the header from the buffer, using previous
        /// </summary>
        private FrameHeader ReadHeader(byte[] buffer, ref int offset, int length, int headerLength,
                                       ProtocolVersion version)
        {
            if (offset == 0)
            {
                var previousHeaderBuffer = Interlocked.Exchange(ref _minHeaderBuffer, null);
                if (previousHeaderBuffer != null)
                {
                    if (previousHeaderBuffer.Length + length < headerLength)
                    {
                        // Unlikely scenario where there were a few bytes for a header buffer and the new bytes are
                        // not enough to complete the header
                        Volatile.Write(ref _minHeaderBuffer,
                                       Utils.JoinBuffers(previousHeaderBuffer, 0, previousHeaderBuffer.Length, buffer, 0, length));
                        return(null);
                    }
                    offset += headerLength - previousHeaderBuffer.Length;
                    // Use the previous and the current buffer to build the header
                    return(FrameHeader.ParseResponseHeader(version, previousHeaderBuffer, buffer));
                }
            }
            if (length - offset < headerLength)
            {
                // There aren't enough bytes in the current buffer to read the header, store it for later
                Volatile.Write(ref _minHeaderBuffer, Utils.SliceBuffer(buffer, offset, length - offset));
                return(null);
            }
            // The header is contained in the current buffer
            var header = FrameHeader.ParseResponseHeader(version, buffer, offset);

            offset += headerLength;
            return(header);
        }
Beispiel #2
0
        private static Response GetResponse(byte[] body, ProtocolVersion version = Version)
        {
            var header = FrameHeader.ParseResponseHeader(version, GetHeaderBuffer(body.Length), 0);

            return(FrameParser.Parse(new Frame(
                                         header, new MemoryStream(body), new SerializerManager(version).GetCurrentSerializer(), null)));
        }
        public void Should_Parse_ErrorResponse_Of_Syntax_Error()
        {
            var body     = GetErrorBody(0x2000, "Test syntax error");
            var header   = FrameHeader.ParseResponseHeader(Version, GetHeaderBuffer(body.Length), 0);
            var response = FrameParser.Parse(new Frame(header, new MemoryStream(body), Serializer.GetCurrentSerializer()));
            var ex       = IsErrorResponse <SyntaxError>(response);

            Assert.AreEqual("Test syntax error", ex.Message);
        }
        public void Should_Parse_ErrorResponse_With_Warnings()
        {
            // Protocol warnings are [string list]: A [short] n, followed by n [string]
            var warningBuffers = BeConverter.GetBytes((ushort)1).Concat(GetProtocolString("Test warning"));
            var body           = warningBuffers.Concat(GetErrorBody(0x2000, "Test syntax error")).ToArray();
            var header         = FrameHeader.ParseResponseHeader(Version, GetHeaderBuffer(body.Length, HeaderFlags.Warning), 0);
            var response       = FrameParser.Parse(new Frame(header, new MemoryStream(body), Serializer.GetCurrentSerializer()));
            var ex             = IsErrorResponse <SyntaxError>(response);

            Assert.AreEqual("Test syntax error", ex.Message);
        }