private RawResult ReadArray(byte[] buffer, ref int offset, ref int count) { var itemCount = ReadLineTerminatedString(ResultType.Integer, buffer, ref offset, ref count); if (itemCount.HasValue) { long i64; if (!itemCount.TryGetInt64(out i64)) { throw ExceptionFactory.ConnectionFailure(multiplexer.IncludeDetailInExceptions, ConnectionFailureType.ProtocolFailure, "Invalid array length", bridge.ServerEndPoint); } int itemCountActual = checked ((int)i64); if (itemCountActual <= 0) { return(RawResult.EmptyArray); } var arr = new RawResult[itemCountActual]; for (int i = 0; i < itemCountActual; i++) { if (!(arr[i] = TryParseResult(buffer, ref offset, ref count)).HasValue) { return(RawResult.Nil); } } return(new RawResult(arr)); } return(RawResult.Nil); }
private RawResult ReadBulkString(byte[] buffer, ref int offset, ref int count) { var prefix = ReadLineTerminatedString(ResultType.Integer, buffer, ref offset, ref count); if (prefix.HasValue) { long i64; if (!prefix.TryGetInt64(out i64)) { throw ExceptionFactory.ConnectionFailure(Multiplexer.IncludeDetailInExceptions, ConnectionFailureType.ProtocolFailure, "Invalid bulk string length", Bridge.ServerEndPoint); } int bodySize = checked ((int)i64); if (bodySize < 0) { return(new RawResult(ResultType.BulkString, null, 0, 0)); } else if (count >= bodySize + 2) { if (buffer[offset + bodySize] != '\r' || buffer[offset + bodySize + 1] != '\n') { throw ExceptionFactory.ConnectionFailure(Multiplexer.IncludeDetailInExceptions, ConnectionFailureType.ProtocolFailure, "Invalid bulk string terminator", Bridge.ServerEndPoint); } var result = new RawResult(ResultType.BulkString, buffer, offset, bodySize); offset += bodySize + 2; count -= bodySize + 2; return(result); } } return(RawResult.Nil); }
private RawResult ReadArray(byte[] buffer, ref int offset, ref int count) { var itemCount = ReadLineTerminatedString(ResultType.Integer, buffer, ref offset, ref count); if (itemCount.HasValue) { if (!itemCount.TryGetInt64(out long i64)) { throw ExceptionFactory.ConnectionFailure(Multiplexer.IncludeDetailInExceptions, ConnectionFailureType.ProtocolFailure, "Invalid array length", Bridge.ServerEndPoint); } int itemCountActual = checked ((int)i64); if (itemCountActual < 0) { //for null response by command like EXEC, RESP array: *-1\r\n return(new RawResult(ResultType.SimpleString, null, 0, 0)); } else if (itemCountActual == 0) { //for zero array response by command like SCAN, Resp array: *0\r\n return(RawResult.EmptyArray); } var arr = new RawResult[itemCountActual]; for (int i = 0; i < itemCountActual; i++) { if (!(arr[i] = TryParseResult(buffer, ref offset, ref count)).HasValue) { return(RawResult.Nil); } } return(new RawResult(arr)); } return(RawResult.Nil); }