private static void ReadCommand(string rawMessage, ref int i, IncomingStompFrame msg) { // Читаем строку до символа \r var start = i; if (!ReadLine(rawMessage, ref i)) { // Команда не найдена throw new StompWireFormatException($"Unable to find command (at {i})"); } // Прочитанная строка не должна быть пустой var end = i - 1; var length = end - start; if (length <= 0) { // Команда пуста throw new StompWireFormatException($"Empty command (at {i})"); } var command = rawMessage.Substring(start, length); msg.SetCommand(command); }
private static void ReadBody(string rawMessage, ref int i, IncomingStompFrame msg) { // Читаем строку до символа \0 var start = i; for (; i < rawMessage.Length && rawMessage[i] != TERMINATOR; i++) { } if (i >= rawMessage.Length) { // Тело не найдено return; } var end = i; var length = end - start; var body = rawMessage.Substring(start, length); msg.SetBody(body); // Опционально дочитываем символы \r\n или \n while (ReadLine(rawMessage, ref i)) { } if (i != rawMessage.Length - 1) { // После терминатора в сообщении не должно быть ничего, кроме \r\n\ throw new StompWireFormatException($"Unconsumed data after terminator (at {i})"); } }
private static bool ReadOneHeader(string rawMessage, ref int i, IncomingStompFrame msg, bool shouldDecode) { // Читаем строку до символа \r var start = i; if (!ReadLine(rawMessage, ref i)) { // Заголовок не найден throw new StompWireFormatException($"Unable to find header (at {i})"); } // Если прочитанная строка пуста - это признак завершения заголовков var end = i - 1; var length = end - start; if (length <= 0) { return(false); } // Внутри диапазона [start; end] ищем первый символ ':' var sep = start; for (; sep <= end && rawMessage[sep] != SEPARATOR; sep++) { } if (rawMessage[sep] != SEPARATOR) { // Разделитель заголовка не найден throw new StompWireFormatException($"Unable to find header separator (at {i})"); } var keyStart = start; var keyEnd = sep; var keyLength = keyEnd - keyStart; if (keyLength <= 0) { // Ключ заголовка пуст throw new StompWireFormatException($"Unable to find header key (at {i})"); } var valueStart = sep + 1; var valueEnd = end; var valueLength = valueEnd - valueStart; var key = DecodeValue(rawMessage, keyStart, keyLength, shouldDecode); var value = DecodeValue(rawMessage, valueStart, valueLength, shouldDecode); msg.SetHeader(key, value); return(true); }
public IStompFrame ReadFrame(string rawMessage) { var msg = new IncomingStompFrame(); var i = 0; ReadCommand(rawMessage, ref i, msg); var shouldDecode = ShouldUseHeaderEncoding(msg.Command); while (ReadOneHeader(rawMessage, ref i, msg, shouldDecode)) { } ReadBody(rawMessage, ref i, msg); msg.Validate(); return(msg); }