/// <summary> /// Writes the serialized representation of a <see cref="HandshakeRequestMessage"/> to the specified writer. /// </summary> /// <param name="requestMessage">The message to write.</param> /// <param name="output">The output writer.</param> public static void WriteRequestMessage(HandshakeRequestMessage requestMessage, IBufferWriter <byte> output) { var writer = new Utf8JsonWriter(output, new JsonWriterState(new JsonWriterOptions() { SkipValidation = true })); writer.WriteStartObject(); writer.WriteString(ProtocolPropertyNameBytes, requestMessage.Protocol, escape: false); writer.WriteNumber(ProtocolVersionPropertyNameBytes, requestMessage.Version, escape: false); writer.WriteEndObject(); writer.Flush(isFinalBlock: true); TextMessageFormatter.WriteRecordSeparator(output); }
/// <summary> /// Writes the serialized representation of a <see cref="HandshakeRequestMessage"/> to the specified writer. /// </summary> /// <param name="requestMessage">The message to write.</param> /// <param name="output">The output writer.</param> public static void WriteRequestMessage(HandshakeRequestMessage requestMessage, IBufferWriter <byte> output) { using var writer = new Utf8JsonWriter(output, new JsonWriterOptions() { SkipValidation = true }); writer.WriteStartObject(); writer.WriteString(ProtocolPropertyNameBytes, requestMessage.Protocol); writer.WriteNumber(ProtocolVersionPropertyNameBytes, requestMessage.Version); writer.WriteEndObject(); writer.Flush(); Debug.Assert(writer.CurrentDepth == 0); TextMessageFormatter.WriteRecordSeparator(output); }
/// <summary> /// Writes the serialized representation of a <see cref="HandshakeRequestMessage"/> to the specified writer. /// </summary> /// <param name="requestMessage">The message to write.</param> /// <param name="output">The output writer.</param> public static void WriteRequestMessage(HandshakeRequestMessage requestMessage, IBufferWriter <byte> output) { var reusableWriter = ReusableUtf8JsonWriter.Get(output); try { var writer = reusableWriter.GetJsonWriter(); writer.WriteStartObject(); writer.WriteString(ProtocolPropertyNameBytes, requestMessage.Protocol); writer.WriteNumber(ProtocolVersionPropertyNameBytes, requestMessage.Version); writer.WriteEndObject(); writer.Flush(); Debug.Assert(writer.CurrentDepth == 0); } finally { ReusableUtf8JsonWriter.Return(reusableWriter); } TextMessageFormatter.WriteRecordSeparator(output); }
/// <summary> /// Writes the serialized representation of a <see cref="HandshakeRequestMessage"/> to the specified writer. /// </summary> /// <param name="requestMessage">The message to write.</param> /// <param name="output">The output writer.</param> public static void WriteRequestMessage(HandshakeRequestMessage requestMessage, IBufferWriter <byte> output) { var textWriter = Utf8BufferTextWriter.Get(output); try { using (var writer = JsonUtils.CreateJsonTextWriter(textWriter)) { writer.WriteStartObject(); writer.WritePropertyName(ProtocolPropertyName); writer.WriteValue(requestMessage.Protocol); writer.WritePropertyName(ProtocolVersionPropertyName); writer.WriteValue(requestMessage.Version); writer.WriteEndObject(); writer.Flush(); } } finally { Utf8BufferTextWriter.Return(textWriter); } TextMessageFormatter.WriteRecordSeparator(output); }
/// <summary> /// Creates a new <see cref="HandshakeRequestMessage"/> from the specified serialized representation. /// </summary> /// <param name="buffer">The serialized representation of the message.</param> /// <param name="requestMessage">When this method returns, contains the parsed message.</param> /// <returns>A value that is <c>true</c> if the <see cref="HandshakeRequestMessage"/> was successfully parsed; otherwise, <c>false</c>.</returns> public static bool TryParseRequestMessage(ref ReadOnlySequence <byte> buffer, out HandshakeRequestMessage requestMessage) { if (!TextMessageParser.TryParseMessage(ref buffer, out var payload)) { requestMessage = null; return(false); } var reader = new Utf8JsonReader(payload, isFinalBlock: true, state: default); reader.CheckRead(); reader.EnsureObjectStart(); string protocol = null; int? protocolVersion = null; while (reader.CheckRead()) { if (reader.TokenType == JsonTokenType.PropertyName) { if (reader.ValueTextEquals(ProtocolPropertyNameBytes.EncodedUtf8Bytes)) { protocol = reader.ReadAsString(ProtocolPropertyName); } else if (reader.ValueTextEquals(ProtocolVersionPropertyNameBytes.EncodedUtf8Bytes)) { protocolVersion = reader.ReadAsInt32(ProtocolVersionPropertyName); } else { reader.Skip(); } } else if (reader.TokenType == JsonTokenType.EndObject) { break; } else { throw new InvalidDataException($"Unexpected token '{reader.TokenType}' when reading handshake request JSON. Message content: {GetPayloadAsString()}"); } } if (protocol == null) { throw new InvalidDataException($"Missing required property '{ProtocolPropertyName}'. Message content: {GetPayloadAsString()}"); } if (protocolVersion == null) { throw new InvalidDataException($"Missing required property '{ProtocolVersionPropertyName}'. Message content: {GetPayloadAsString()}"); } requestMessage = new HandshakeRequestMessage(protocol, protocolVersion.Value); // For error messages, we want to print the payload as text string GetPayloadAsString() { // REVIEW: Should we show hex for binary charaters? return(Encoding.UTF8.GetString(payload.ToArray())); } return(true); }
/// <summary> /// Creates a new <see cref="HandshakeRequestMessage"/> from the specified serialized representation. /// </summary> /// <param name="buffer">The serialized representation of the message.</param> /// <param name="requestMessage">When this method returns, contains the parsed message.</param> /// <returns>A value that is <c>true</c> if the <see cref="HandshakeRequestMessage"/> was successfully parsed; otherwise, <c>false</c>.</returns> public static bool TryParseRequestMessage(ref ReadOnlySequence <byte> buffer, out HandshakeRequestMessage requestMessage) { if (!TextMessageParser.TryParseMessage(ref buffer, out var payload)) { requestMessage = null; return(false); } var textReader = Utf8BufferTextReader.Get(payload); try { using (var reader = JsonUtils.CreateJsonTextReader(textReader)) { JsonUtils.CheckRead(reader); JsonUtils.EnsureObjectStart(reader); string protocol = null; int? protocolVersion = null; var completed = false; while (!completed && JsonUtils.CheckRead(reader)) { switch (reader.TokenType) { case JsonToken.PropertyName: var memberName = reader.Value.ToString(); switch (memberName) { case ProtocolPropertyName: protocol = JsonUtils.ReadAsString(reader, ProtocolPropertyName); break; case ProtocolVersionPropertyName: protocolVersion = JsonUtils.ReadAsInt32(reader, ProtocolVersionPropertyName); break; default: reader.Skip(); break; } break; case JsonToken.EndObject: completed = true; break; default: throw new InvalidDataException($"Unexpected token '{reader.TokenType}' when reading handshake request JSON. Message content: {GetPayloadAsString()}"); } } if (protocol == null) { throw new InvalidDataException($"Missing required property '{ProtocolPropertyName}'. Message content: {GetPayloadAsString()}"); } if (protocolVersion == null) { throw new InvalidDataException($"Missing required property '{ProtocolVersionPropertyName}'. Message content: {GetPayloadAsString()}"); } requestMessage = new HandshakeRequestMessage(protocol, protocolVersion.Value); } } finally { Utf8BufferTextReader.Return(textReader); } // For error messages, we want to print the payload as text string GetPayloadAsString() { // REVIEW: Should we show hex for binary charaters? return(Encoding.UTF8.GetString(payload.ToArray())); } return(true); }