From 39908f08c457684d31188475b047385c4cca3eaf Mon Sep 17 00:00:00 2001 From: Alexander Rose Date: Mon, 20 Apr 2020 21:59:10 +0200 Subject: [PATCH] add action property to configure ClientWebsocketOptions to GraphQLHttpClientOptions --- src/GraphQL.Client/GraphQLHttpClientOptions.cs | 6 ++++++ src/GraphQL.Client/Websocket/GraphQLHttpWebSocket.cs | 8 +++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/GraphQL.Client/GraphQLHttpClientOptions.cs b/src/GraphQL.Client/GraphQLHttpClientOptions.cs index 8b551cf0..0c6df2ee 100644 --- a/src/GraphQL.Client/GraphQLHttpClientOptions.cs +++ b/src/GraphQL.Client/GraphQLHttpClientOptions.cs @@ -1,6 +1,7 @@ using System; using System.Net.Http; using System.Net.Http.Headers; +using System.Net.WebSockets; using System.Threading.Tasks; namespace GraphQL.Client.Http @@ -52,5 +53,10 @@ public class GraphQLHttpClientOptions /// This callback is called after successfully establishing a websocket connection but before any regular request is made. /// public Func OnWebsocketConnected { get; set; } = client => Task.CompletedTask; + + /// + /// Configure additional websocket options (i.e. headers). This will not be invoked on Windows 7 when targeting .NET Framework 4.x. + /// + public Action ConfigureWebsocketOptions { get; set; } = options => { }; } } diff --git a/src/GraphQL.Client/Websocket/GraphQLHttpWebSocket.cs b/src/GraphQL.Client/Websocket/GraphQLHttpWebSocket.cs index f0156030..227b53cd 100644 --- a/src/GraphQL.Client/Websocket/GraphQLHttpWebSocket.cs +++ b/src/GraphQL.Client/Websocket/GraphQLHttpWebSocket.cs @@ -399,12 +399,13 @@ public Task InitializeWebSocket() nativeWebSocket.Options.AddSubProtocol("graphql-ws"); nativeWebSocket.Options.ClientCertificates = ((HttpClientHandler)Options.HttpMessageHandler).ClientCertificates; nativeWebSocket.Options.UseDefaultCredentials = ((HttpClientHandler)Options.HttpMessageHandler).UseDefaultCredentials; - break; + Options.ConfigureWebsocketOptions(nativeWebSocket.Options); + break; case System.Net.WebSockets.Managed.ClientWebSocket managedWebSocket: managedWebSocket.Options.AddSubProtocol("graphql-ws"); managedWebSocket.Options.ClientCertificates = ((HttpClientHandler)Options.HttpMessageHandler).ClientCertificates; managedWebSocket.Options.UseDefaultCredentials = ((HttpClientHandler)Options.HttpMessageHandler).UseDefaultCredentials; - break; + break; default: throw new NotSupportedException($"unknown websocket type {_clientWebSocket.GetType().Name}"); } @@ -413,6 +414,7 @@ public Task InitializeWebSocket() _clientWebSocket.Options.AddSubProtocol("graphql-ws"); _clientWebSocket.Options.ClientCertificates = ((HttpClientHandler)Options.HttpMessageHandler).ClientCertificates; _clientWebSocket.Options.UseDefaultCredentials = ((HttpClientHandler)Options.HttpMessageHandler).UseDefaultCredentials; + Options.ConfigureWebsocketOptions(_clientWebSocket.Options); #endif return _initializeWebSocketTask = ConnectAsync(_internalCancellationToken); } @@ -609,7 +611,7 @@ public void Complete() /// Task to await the completion (a.k.a. disposal) of this websocket. /// /// Async disposal as recommended by Stephen Cleary (https://blog.stephencleary.com/2013/03/async-oop-6-disposal.html) - public Task Completion { get; private set; } + public Task? Completion { get; private set; } private readonly object _completedLocker = new object(); private async Task CompleteAsync()