Skip to content

Commit 5b59759

Browse files
authored
Merge pull request #277 from graphql-dotnet/handle-websocket-url-scheme
handle WebSocket url scheme
2 parents ba2e143 + fa944ec commit 5b59759

File tree

3 files changed

+42
-11
lines changed

3 files changed

+42
-11
lines changed

src/GraphQL.Client/GraphQLHttpClient.cs

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public GraphQLHttpClient(Uri endPoint, IGraphQLWebsocketJsonSerializer serialize
5555
public GraphQLHttpClient(Action<GraphQLHttpClientOptions> configure, IGraphQLWebsocketJsonSerializer serializer) : this(configure.New(), serializer) { }
5656

5757
public GraphQLHttpClient(GraphQLHttpClientOptions options, IGraphQLWebsocketJsonSerializer serializer) : this(options, serializer, new HttpClient(options.HttpMessageHandler)) { }
58-
58+
5959
public GraphQLHttpClient(GraphQLHttpClientOptions options, IGraphQLWebsocketJsonSerializer serializer, HttpClient httpClient)
6060
{
6161
Options = options ?? throw new ArgumentNullException(nameof(options));
@@ -65,7 +65,7 @@ public GraphQLHttpClient(GraphQLHttpClientOptions options, IGraphQLWebsocketJson
6565
if (!HttpClient.DefaultRequestHeaders.UserAgent.Any())
6666
HttpClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue(GetType().Assembly.GetName().Name, GetType().Assembly.GetName().Version.ToString()));
6767

68-
_lazyHttpWebSocket = new Lazy<GraphQLHttpWebSocket>(() => new GraphQLHttpWebSocket(GetWebSocketUri(), this));
68+
_lazyHttpWebSocket = new Lazy<GraphQLHttpWebSocket>(() => new GraphQLHttpWebSocket(Options.EndPoint.GetWebSocketUri(), this));
6969
}
7070

7171
#endregion
@@ -75,7 +75,7 @@ public GraphQLHttpClient(GraphQLHttpClientOptions options, IGraphQLWebsocketJson
7575
/// <inheritdoc />
7676
public async Task<GraphQLResponse<TResponse>> SendQueryAsync<TResponse>(GraphQLRequest request, CancellationToken cancellationToken = default)
7777
{
78-
if (Options.UseWebSocketForQueriesAndMutations)
78+
if (Options.UseWebSocketForQueriesAndMutations || Options.EndPoint.HasWebSocketScheme())
7979
return await _graphQlHttpWebSocket.SendRequest<TResponse>(request, cancellationToken);
8080

8181
return await SendHttpRequestAsync<TResponse>(request, cancellationToken);
@@ -132,7 +132,7 @@ public IObservable<GraphQLResponse<TResponse>> CreateSubscriptionStream<TRespons
132132
private async Task<GraphQLHttpResponse<TResponse>> SendHttpRequestAsync<TResponse>(GraphQLRequest request, CancellationToken cancellationToken = default)
133133
{
134134
var preprocessedRequest = await Options.PreprocessRequest(request, this);
135-
135+
136136
using var httpRequestMessage = preprocessedRequest.ToHttpRequestMessage(Options, JsonSerializer);
137137
using var httpResponseMessage = await HttpClient.SendAsync(httpRequestMessage, HttpCompletionOption.ResponseHeadersRead, cancellationToken);
138138

@@ -152,13 +152,6 @@ private async Task<GraphQLHttpResponse<TResponse>> SendHttpRequestAsync<TRespons
152152

153153
throw new GraphQLHttpRequestException(httpResponseMessage.StatusCode, httpResponseMessage.Headers, content);
154154
}
155-
156-
private Uri GetWebSocketUri()
157-
{
158-
string webSocketSchema = Options.EndPoint.Scheme == "https" ? "wss" : "ws";
159-
return new Uri($"{webSocketSchema}://{Options.EndPoint.Host}:{Options.EndPoint.Port}{Options.EndPoint.AbsolutePath}");
160-
}
161-
162155
#endregion
163156

164157
#region IDisposable

src/GraphQL.Client/UriExtensions.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using System;
2+
3+
namespace GraphQL.Client.Http
4+
{
5+
public static class UriExtensions
6+
{
7+
/// <summary>
8+
/// Returns true if <see cref="Uri.Scheme"/> equals "wss" or "ws"
9+
/// </summary>
10+
/// <param name="uri"></param>
11+
/// <returns></returns>
12+
public static bool HasWebSocketScheme(this Uri uri) => uri.Scheme.Equals("wss") || uri.Scheme.Equals("ws");
13+
14+
/// <summary>
15+
/// Infers the websocket uri from <paramref name="uri"/>.
16+
/// </summary>
17+
/// <param name="uri"></param>
18+
/// <returns></returns>
19+
public static Uri GetWebSocketUri(this Uri uri)
20+
{
21+
if (uri.HasWebSocketScheme())
22+
return uri;
23+
24+
string webSocketScheme = uri.Scheme == "https" ? "wss" : "ws";
25+
return new Uri($"{webSocketScheme}://{uri.Host}:{uri.Port}{uri.PathAndQuery}");
26+
}
27+
}
28+
}

tests/GraphQL.Integration.Tests/WebsocketTests/Base.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,16 @@ public async void CanSendRequestViaWebsocket()
7070
response.Data.AddMessage.Content.Should().Be(message);
7171
}
7272

73+
[Fact]
74+
public async void CanUseWebSocketScheme()
75+
{
76+
ChatClient.Options.EndPoint = ChatClient.Options.EndPoint.GetWebSocketUri();
77+
await ChatClient.InitializeWebsocketConnection();
78+
const string message = "some random testing message";
79+
var response = await ChatClient.AddMessageAsync(message);
80+
response.Data.AddMessage.Content.Should().Be(message);
81+
}
82+
7383
[Fact]
7484
public async void WebsocketRequestCanBeCancelled()
7585
{

0 commit comments

Comments
 (0)