/// <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); }
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); }