diff --git a/src/GraphQL.Client.LocalExecution/GraphQLLocalExecutionClient.cs b/src/GraphQL.Client.LocalExecution/GraphQLLocalExecutionClient.cs index d458d20e..f8fe6503 100644 --- a/src/GraphQL.Client.LocalExecution/GraphQLLocalExecutionClient.cs +++ b/src/GraphQL.Client.LocalExecution/GraphQLLocalExecutionClient.cs @@ -79,8 +79,11 @@ private async Task> ExecuteQueryAsync(Grap private async Task>> ExecuteSubscriptionAsync(GraphQLRequest request, CancellationToken cancellationToken = default) { var result = await ExecuteAsync(request, cancellationToken); - return ((SubscriptionExecutionResult)result).Streams?.Values.SingleOrDefault()? - .SelectMany(executionResult => Observable.FromAsync(token => ExecutionResultToGraphQLResponse(executionResult, token))); + var stream = ((SubscriptionExecutionResult)result).Streams?.Values.SingleOrDefault(); + + return stream == null + ? Observable.Throw>(new InvalidOperationException("the GraphQL execution did not return an observable")) + : stream.SelectMany(executionResult => Observable.FromAsync(token => ExecutionResultToGraphQLResponse(executionResult, token))); } private async Task ExecuteAsync(GraphQLRequest request, CancellationToken cancellationToken = default) diff --git a/src/GraphQL.Client/GraphQLHttpClient.cs b/src/GraphQL.Client/GraphQLHttpClient.cs index 5d8453ef..1f9a3b5a 100644 --- a/src/GraphQL.Client/GraphQLHttpClient.cs +++ b/src/GraphQL.Client/GraphQLHttpClient.cs @@ -2,7 +2,9 @@ using System.Collections.Concurrent; using System.Diagnostics; using System.IO; +using System.Linq; using System.Net.Http; +using System.Net.Http.Headers; using System.Threading; using System.Threading.Tasks; using GraphQL.Client.Abstractions; @@ -57,6 +59,10 @@ public GraphQLHttpClient(GraphQLHttpClientOptions options, IGraphQLWebsocketJson Options = options ?? throw new ArgumentNullException(nameof(options)); JsonSerializer = serializer ?? throw new ArgumentNullException(nameof(serializer), "please configure the JSON serializer you want to use"); HttpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient)); + + if (!HttpClient.DefaultRequestHeaders.UserAgent.Any()) + HttpClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue(GetType().Assembly.GetName().Name, GetType().Assembly.GetName().Version.ToString())); + _graphQlHttpWebSocket = new GraphQLHttpWebSocket(GetWebSocketUri(), this); } diff --git a/src/GraphQL.Client/Websocket/GraphQLHttpWebSocket.cs b/src/GraphQL.Client/Websocket/GraphQLHttpWebSocket.cs index 643df77e..652e3f77 100644 --- a/src/GraphQL.Client/Websocket/GraphQLHttpWebSocket.cs +++ b/src/GraphQL.Client/Websocket/GraphQLHttpWebSocket.cs @@ -3,6 +3,7 @@ using System.IO; using System.Net.Http; using System.Net.WebSockets; +using System.Reactive; using System.Reactive.Concurrency; using System.Reactive.Disposables; using System.Reactive.Linq; @@ -84,7 +85,8 @@ public GraphQLHttpWebSocket(Uri webSocketUri, GraphQLHttpClient client) _requestSubscription = _requestSubject .ObserveOn(_sendLoopScheduler) - .Subscribe(async request => await SendWebSocketRequestAsync(request)); + .SelectMany(SendWebSocketRequestAsync) + .Subscribe(); } #region Send requests @@ -339,14 +341,14 @@ private Task QueueWebSocketRequest(GraphQLWebSocketRequest request) return request.SendTask(); } - private async Task SendWebSocketRequestAsync(GraphQLWebSocketRequest request) + private async Task SendWebSocketRequestAsync(GraphQLWebSocketRequest request) { try { if (_internalCancellationToken.IsCancellationRequested) { request.SendCanceled(); - return; + return Unit.Default; } await InitializeWebSocket(); @@ -362,6 +364,7 @@ await _clientWebSocket.SendAsync( { request.SendFailed(e); } + return Unit.Default; } #endregion diff --git a/src/src.props b/src/src.props index 91497142..c4e46be1 100644 --- a/src/src.props +++ b/src/src.props @@ -7,9 +7,8 @@ 8.0 - - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive