Example #1
0
        private async Task WriteEscapedString(string str, CancellationToken cancellationToken)
        {
            int cue = 0;

            for (int i = 0; i < str.Length; i++)
            {
                byte[] escapedChar = StompOctets.EscapeOctet(str[i]);

                if (escapedChar != null)
                {
                    await _writer.WriteAsync(str, cue, i - cue, cancellationToken);

                    await _writer.WriteAsync(escapedChar, cancellationToken);

                    cue = i + 1;
                }
            }
            await _writer.WriteAsync(str, cue, str.Length - cue, cancellationToken);
        }
Example #2
0
        private async Task <IEnumerable <KeyValuePair <string, string> > > ReadHeaders(CancellationToken cancellationToken)
        {
            StringBuilder stringBuilder = new StringBuilder();
            var           headers       = new List <KeyValuePair <string, string> >();

            while (true)
            {
                // Get Header Name
                char ch = await _reader.ReadCharAsync(cancellationToken);

                if (ch == '\n')
                {
                    break;
                }
                else if (ch == '\r')
                {
                    if (await _reader.ReadCharAsync(cancellationToken) == '\n')
                    {
                        break;
                    }
                    throw new InvalidDataException("Header data MUST not contain CR, LF or ':' characters.");
                }

                stringBuilder.Clear();

                while (ch != ':')
                {
                    if (ch == '\n' || ch == '\r')
                    {
                        throw new InvalidDataException("Headers data MUST not contain CR, LF or ':' characters.");
                    }
                    else if (ch == '\\')
                    {
                        stringBuilder.Append(StompOctets.UnescapeOctet(await _reader.ReadCharAsync(cancellationToken)));
                    }
                    else
                    {
                        stringBuilder.Append(ch);
                    }

                    ch = await _reader.ReadCharAsync(cancellationToken);
                }

                string headerName = stringBuilder.ToString();

                // Get Header Value
                ch = await _reader.ReadCharAsync(cancellationToken);

                stringBuilder.Clear();

                while (ch != '\n' && ch != '\r')
                {
                    if (ch == ':')
                    {
                        throw new InvalidDataException("Headers data MUST not contain CR, LF or ':' characters.");
                    }
                    else if (ch == '\\')
                    {
                        stringBuilder.Append(StompOctets.UnescapeOctet(await _reader.ReadCharAsync(cancellationToken)));
                    }
                    else
                    {
                        stringBuilder.Append(ch);
                    }

                    ch = await _reader.ReadCharAsync(cancellationToken);
                }

                if (ch == '\r' && await _reader.ReadCharAsync(cancellationToken) != '\n')
                {
                    throw new InvalidDataException("Header data MUST not contain CR, LF or ':' characters.");
                }

                string headerValue = stringBuilder.ToString();

                headers.Add(new KeyValuePair <string, string>(headerName, headerValue));
            }

            return(headers);
        }