private static void WriteBulkString(Stream stream, RespValue value) { if (value.IsNull()) { WriteNullable(stream, '$'); } else { WriteBytes(stream, value, '$', true); } }
private static void WriteBytes(Stream stream, RespValue value, char header, bool withLength = false) { WriteHeader(stream, header); var bytes = value.GetBytes(); if (withLength) { WriteInt(stream, bytes.Length); WriteCrLf(stream); } WriteBytes(stream, bytes); WriteCrLf(stream); }
public RespValue Execute(IExecutionContext context, RespValue request) { try { EnsureArray(request); var requestParts = request.GetItems(); EnsureNonEmptyArray(requestParts); var commandPart = requestParts.First(); var argumentsPart = requestParts.Skip(1).ToArray(); var commandName = commandPart.GetString().ToUpperInvariant(); ICommand command; if (!commandsMap.TryGetValue(commandName, out command)) { return RespValue.Error(string.Format("ERR Unknown command '{0}'", commandName)); } return command.Execute(context, argumentsPart); } catch (Exception) { return SharedContrants.UnknownError; } }
private static void WriteRespValue(Stream stream, RespValue respValue) { switch (respValue.Type) { case RespValueType.SimpleString: WriteSimpleString(stream, respValue); break; case RespValueType.Error: WriteErrorString(stream, respValue); break; case RespValueType.BulkString: WriteBulkString(stream, respValue); break; case RespValueType.Array: { if (respValue.IsNull()) { WriteNullable(stream, '*'); } else { var respValues = respValue.GetItems(); WriteHeader(stream, '*'); WriteInt(stream, respValues.Length); WriteCrLf(stream); foreach (var item in respValues) WriteRespValue(stream, item); } break; } case RespValueType.Integer: { WriteInteger(stream, respValue); break; } default: throw new ArgumentOutOfRangeException("respValue", respValue.Type.ToString()); } }
private void EnsureNonEmptyArray(RespValue[] arguments) { if (arguments != null && arguments.Any()) return; throw new Exception(); }
private void EnsureArray(RespValue request) { if (request.Type == RespValueType.Array) return; throw new Exception(); }
public bool TryPollRequest(out RespValue request) { request = null; if (!Paused && socket.Poll(0, SelectMode.SelectRead)) { var pollBufferFreeSpace = ResizeBufferAndGetFreeSpace(ref pollBuffer, pollBytes); var receivedBytes = socket.Receive(pollBuffer, pollBytes, pollBufferFreeSpace, SocketFlags.None); pollBytes += receivedBytes; var respParseResult = RespParser.Parse(pollBuffer, 0, pollBytes); if (respParseResult.Status == RespParseStatus.Success) { request = respParseResult.Value; var valueBytes = respParseResult.ValueBytes; var remainingBytes = pollBytes - valueBytes; if (remainingBytes != 0) { Buffer.BlockCopy(pollBuffer, valueBytes, pollBuffer, 0, remainingBytes); pollBytes = remainingBytes; } else { pollBytes = 0; } return true; } } return false; }
public void PushResponse(RespValue response) { var bytes = RespGenerator.Generate(response); socket.Send(bytes); }
public static RespValue Array(RespValue[] values) { return new RespValue(RespValueType.Array, values); }
public static byte[] Generate(RespValue respValue) { var stream = new MemoryStream(); WriteRespValue(stream, respValue); return stream.ToArray(); }
private static void WriteInteger(Stream stream, RespValue respValue) { WriteHeader(stream, ':'); WriteInt(stream, respValue.GetInt()); WriteCrLf(stream); }
private static void WriteErrorString(Stream stream, RespValue value) { WriteBytes(stream, value, '-'); }
private static void WriteSimpleString(Stream stream, RespValue value) { WriteBytes(stream, value, '+'); }