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