private static void WriteNegotiatePayload(IBufferWriter <byte> writer, string connectionId, HttpContext context, HttpConnectionOptions options) { var response = new NegotiationResponse(); response.ConnectionId = connectionId; response.AvailableTransports = new List <AvailableTransport>(); if ((options.Transports & HttpTransportType.WebSockets) != 0 && ServerHasWebSockets(context.Features)) { response.AvailableTransports.Add(_webSocketAvailableTransport); } if ((options.Transports & HttpTransportType.ServerSentEvents) != 0) { response.AvailableTransports.Add(_serverSentEventsAvailableTransport); } if ((options.Transports & HttpTransportType.LongPolling) != 0) { response.AvailableTransports.Add(_longPollingAvailableTransport); } NegotiateProtocol.WriteResponse(response, writer); }
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) { 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); } }
public static void WriteResponse(NegotiationResponse response, IBufferWriter <byte> output) { var textWriter = Utf8BufferTextWriter.Get(output); try { using (var jsonWriter = JsonUtils.CreateJsonTextWriter(textWriter)) { jsonWriter.WriteStartObject(); if (!string.IsNullOrEmpty(response.Url)) { jsonWriter.WritePropertyName(UrlPropertyName); jsonWriter.WriteValue(response.Url); } if (!string.IsNullOrEmpty(response.AccessToken)) { jsonWriter.WritePropertyName(AccessTokenPropertyName); jsonWriter.WriteValue(response.AccessToken); } if (!string.IsNullOrEmpty(response.ConnectionId)) { jsonWriter.WritePropertyName(ConnectionIdPropertyName); jsonWriter.WriteValue(response.ConnectionId); } jsonWriter.WritePropertyName(AvailableTransportsPropertyName); jsonWriter.WriteStartArray(); if (response.AvailableTransports != null) { foreach (var availableTransport in response.AvailableTransports) { jsonWriter.WriteStartObject(); jsonWriter.WritePropertyName(TransportPropertyName); jsonWriter.WriteValue(availableTransport.Transport); jsonWriter.WritePropertyName(TransferFormatsPropertyName); jsonWriter.WriteStartArray(); if (availableTransport.TransferFormats != null) { foreach (var transferFormat in availableTransport.TransferFormats) { jsonWriter.WriteValue(transferFormat); } } jsonWriter.WriteEndArray(); jsonWriter.WriteEndObject(); } } jsonWriter.WriteEndArray(); jsonWriter.WriteEndObject(); jsonWriter.Flush(); } } finally { Utf8BufferTextWriter.Return(textWriter); } }
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); } }