Пример #1
0
        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);
        }
Пример #2
0
        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})");
            }
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }