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); }
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); }