/// <summary> /// Writes the <paramref name="response"/> to the <paramref name="output"/>. /// </summary> /// <param name="response">The negotiation response generated in response to a negotiation request.</param> /// <param name="output">Where the <paramref name="response"/> is written to as Json.</param> public static void WriteResponse(NegotiationResponse response, IBufferWriter <byte> output) { var reusableWriter = ReusableUtf8JsonWriter.Get(output); try { var writer = reusableWriter.GetJsonWriter(); writer.WriteStartObject(); // If we already have an error its due to a protocol version incompatibility. // We can just write the error and complete the JSON object and return. if (!string.IsNullOrEmpty(response.Error)) { writer.WriteString(ErrorPropertyNameBytes, response.Error); writer.WriteEndObject(); writer.Flush(); Debug.Assert(writer.CurrentDepth == 0); return; } writer.WriteNumber(NegotiateVersionPropertyNameBytes, response.Version); if (!string.IsNullOrEmpty(response.Url)) { writer.WriteString(UrlPropertyNameBytes, response.Url); } if (!string.IsNullOrEmpty(response.AccessToken)) { writer.WriteString(AccessTokenPropertyNameBytes, response.AccessToken); } if (!string.IsNullOrEmpty(response.ConnectionId)) { writer.WriteString(ConnectionIdPropertyNameBytes, response.ConnectionId); } if (response.Version > 0 && !string.IsNullOrEmpty(response.ConnectionToken)) { writer.WriteString(ConnectionTokenPropertyNameBytes, response.ConnectionToken); } writer.WriteStartArray(AvailableTransportsPropertyNameBytes); if (response.AvailableTransports != null) { var transportCount = response.AvailableTransports.Count; for (var i = 0; i < transportCount; ++i) { var availableTransport = response.AvailableTransports[i]; writer.WriteStartObject(); if (availableTransport.Transport != null) { writer.WriteString(TransportPropertyNameBytes, availableTransport.Transport); } else { // Might be able to remove this after https://github.com/dotnet/corefx/issues/34632 is resolved writer.WriteNull(TransportPropertyNameBytes); } writer.WriteStartArray(TransferFormatsPropertyNameBytes); if (availableTransport.TransferFormats != null) { var formatCount = availableTransport.TransferFormats.Count; for (var j = 0; j < formatCount; ++j) { writer.WriteStringValue(availableTransport.TransferFormats[j]); } } writer.WriteEndArray(); writer.WriteEndObject(); } } writer.WriteEndArray(); writer.WriteEndObject(); writer.Flush(); Debug.Assert(writer.CurrentDepth == 0); } finally { ReusableUtf8JsonWriter.Return(reusableWriter); } }
private void WriteMessageCore(HubMessage message, IBufferWriter <byte> stream) { var reusableWriter = ReusableUtf8JsonWriter.Get(stream); try { var writer = reusableWriter.GetJsonWriter(); writer.WriteStartObject(); switch (message) { case InvocationMessage m: WriteMessageType(writer, HubProtocolConstants.InvocationMessageType); WriteHeaders(writer, m); WriteInvocationMessage(m, writer); break; case StreamInvocationMessage m: WriteMessageType(writer, HubProtocolConstants.StreamInvocationMessageType); WriteHeaders(writer, m); WriteStreamInvocationMessage(m, writer); break; case StreamItemMessage m: WriteMessageType(writer, HubProtocolConstants.StreamItemMessageType); WriteHeaders(writer, m); WriteStreamItemMessage(m, writer); break; case CompletionMessage m: WriteMessageType(writer, HubProtocolConstants.CompletionMessageType); WriteHeaders(writer, m); WriteCompletionMessage(m, writer); break; case CancelInvocationMessage m: WriteMessageType(writer, HubProtocolConstants.CancelInvocationMessageType); WriteHeaders(writer, m); WriteCancelInvocationMessage(m, writer); break; case PingMessage _: WriteMessageType(writer, HubProtocolConstants.PingMessageType); break; case CloseMessage m: WriteMessageType(writer, HubProtocolConstants.CloseMessageType); WriteCloseMessage(m, writer); break; default: throw new InvalidOperationException($"Unsupported message type: {message.GetType().FullName}"); } writer.WriteEndObject(); writer.Flush(); Debug.Assert(writer.CurrentDepth == 0); } finally { ReusableUtf8JsonWriter.Return(reusableWriter); } }
public static void WriteResponse(NegotiationResponse response, IBufferWriter <byte> output) { var reusableWriter = ReusableUtf8JsonWriter.Get(output); try { var writer = reusableWriter.GetJsonWriter(); writer.WriteStartObject(); if (!string.IsNullOrEmpty(response.Url)) { writer.WriteString(UrlPropertyNameBytes, response.Url); } if (!string.IsNullOrEmpty(response.AccessToken)) { writer.WriteString(AccessTokenPropertyNameBytes, response.AccessToken); } if (!string.IsNullOrEmpty(response.ConnectionId)) { writer.WriteString(ConnectionIdPropertyNameBytes, response.ConnectionId); } writer.WriteStartArray(AvailableTransportsPropertyNameBytes); if (response.AvailableTransports != null) { foreach (var availableTransport in response.AvailableTransports) { writer.WriteStartObject(); if (availableTransport.Transport != null) { writer.WriteString(TransportPropertyNameBytes, availableTransport.Transport); } else { // Might be able to remove this after https://github.com/dotnet/corefx/issues/34632 is resolved writer.WriteNull(TransportPropertyNameBytes); } writer.WriteStartArray(TransferFormatsPropertyNameBytes); if (availableTransport.TransferFormats != null) { foreach (var transferFormat in availableTransport.TransferFormats) { writer.WriteStringValue(transferFormat); } } writer.WriteEndArray(); writer.WriteEndObject(); } } writer.WriteEndArray(); writer.WriteEndObject(); writer.Flush(); Debug.Assert(writer.CurrentDepth == 0); } finally { ReusableUtf8JsonWriter.Return(reusableWriter); } }