Skip to content

Commit 39908f0

Browse files
committed
add action property to configure ClientWebsocketOptions to GraphQLHttpClientOptions
1 parent 29407e0 commit 39908f0

File tree

2 files changed

+11
-3
lines changed

2 files changed

+11
-3
lines changed

src/GraphQL.Client/GraphQLHttpClientOptions.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Net.Http;
33
using System.Net.Http.Headers;
4+
using System.Net.WebSockets;
45
using System.Threading.Tasks;
56

67
namespace GraphQL.Client.Http
@@ -52,5 +53,10 @@ public class GraphQLHttpClientOptions
5253
/// This callback is called after successfully establishing a websocket connection but before any regular request is made.
5354
/// </summary>
5455
public Func<GraphQLHttpClient, Task> OnWebsocketConnected { get; set; } = client => Task.CompletedTask;
56+
57+
/// <summary>
58+
/// Configure additional websocket options (i.e. headers). This will not be invoked on Windows 7 when targeting .NET Framework 4.x.
59+
/// </summary>
60+
public Action<ClientWebSocketOptions> ConfigureWebsocketOptions { get; set; } = options => { };
5561
}
5662
}

src/GraphQL.Client/Websocket/GraphQLHttpWebSocket.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -399,12 +399,13 @@ public Task InitializeWebSocket()
399399
nativeWebSocket.Options.AddSubProtocol("graphql-ws");
400400
nativeWebSocket.Options.ClientCertificates = ((HttpClientHandler)Options.HttpMessageHandler).ClientCertificates;
401401
nativeWebSocket.Options.UseDefaultCredentials = ((HttpClientHandler)Options.HttpMessageHandler).UseDefaultCredentials;
402-
break;
402+
Options.ConfigureWebsocketOptions(nativeWebSocket.Options);
403+
break;
403404
case System.Net.WebSockets.Managed.ClientWebSocket managedWebSocket:
404405
managedWebSocket.Options.AddSubProtocol("graphql-ws");
405406
managedWebSocket.Options.ClientCertificates = ((HttpClientHandler)Options.HttpMessageHandler).ClientCertificates;
406407
managedWebSocket.Options.UseDefaultCredentials = ((HttpClientHandler)Options.HttpMessageHandler).UseDefaultCredentials;
407-
break;
408+
break;
408409
default:
409410
throw new NotSupportedException($"unknown websocket type {_clientWebSocket.GetType().Name}");
410411
}
@@ -413,6 +414,7 @@ public Task InitializeWebSocket()
413414
_clientWebSocket.Options.AddSubProtocol("graphql-ws");
414415
_clientWebSocket.Options.ClientCertificates = ((HttpClientHandler)Options.HttpMessageHandler).ClientCertificates;
415416
_clientWebSocket.Options.UseDefaultCredentials = ((HttpClientHandler)Options.HttpMessageHandler).UseDefaultCredentials;
417+
Options.ConfigureWebsocketOptions(_clientWebSocket.Options);
416418
#endif
417419
return _initializeWebSocketTask = ConnectAsync(_internalCancellationToken);
418420
}
@@ -609,7 +611,7 @@ public void Complete()
609611
/// Task to await the completion (a.k.a. disposal) of this websocket.
610612
/// </summary>
611613
/// Async disposal as recommended by Stephen Cleary (https://blog.stephencleary.com/2013/03/async-oop-6-disposal.html)
612-
public Task Completion { get; private set; }
614+
public Task? Completion { get; private set; }
613615

614616
private readonly object _completedLocker = new object();
615617
private async Task CompleteAsync()

0 commit comments

Comments
 (0)