1
1
using System ;
2
- using System . Collections . Concurrent ;
3
2
using System . Diagnostics ;
4
3
using System . IO ;
5
4
using System . Linq ;
@@ -19,7 +18,6 @@ public class GraphQLHttpClient : IGraphQLClient
19
18
private GraphQLHttpWebSocket GraphQlHttpWebSocket => _lazyHttpWebSocket . Value ;
20
19
21
20
private readonly CancellationTokenSource _cancellationTokenSource = new CancellationTokenSource ( ) ;
22
- private readonly ConcurrentDictionary < Tuple < GraphQLRequest , Type > , object > _subscriptionStreams = new ConcurrentDictionary < Tuple < GraphQLRequest , Type > , object > ( ) ;
23
21
24
22
private readonly bool _disposeHttpClient = false ;
25
23
@@ -85,9 +83,9 @@ public async Task<GraphQLResponse<TResponse>> SendQueryAsync<TResponse>(GraphQLR
85
83
if ( Options . UseWebSocketForQueriesAndMutations ||
86
84
! ( Options . WebSocketEndPoint is null ) && Options . EndPoint is null ||
87
85
Options . EndPoint . HasWebSocketScheme ( ) )
88
- return await GraphQlHttpWebSocket . SendRequest < TResponse > ( request , cancellationToken ) ;
86
+ return await GraphQlHttpWebSocket . SendRequest < TResponse > ( request , cancellationToken ) . ConfigureAwait ( false ) ;
89
87
90
- return await SendHttpRequestAsync < TResponse > ( request , cancellationToken ) ;
88
+ return await SendHttpRequestAsync < TResponse > ( request , cancellationToken ) . ConfigureAwait ( false ) ;
91
89
}
92
90
93
91
/// <inheritdoc />
@@ -97,34 +95,15 @@ public Task<GraphQLResponse<TResponse>> SendMutationAsync<TResponse>(GraphQLRequ
97
95
98
96
/// <inheritdoc />
99
97
public IObservable < GraphQLResponse < TResponse > > CreateSubscriptionStream < TResponse > ( GraphQLRequest request )
100
- {
101
- if ( _disposed )
102
- throw new ObjectDisposedException ( nameof ( GraphQLHttpClient ) ) ;
103
-
104
- var key = new Tuple < GraphQLRequest , Type > ( request , typeof ( TResponse ) ) ;
105
-
106
- if ( _subscriptionStreams . ContainsKey ( key ) )
107
- return ( IObservable < GraphQLResponse < TResponse > > ) _subscriptionStreams [ key ] ;
108
-
109
- var observable = GraphQlHttpWebSocket . CreateSubscriptionStream < TResponse > ( request ) ;
110
-
111
- _subscriptionStreams . TryAdd ( key , observable ) ;
112
- return observable ;
113
- }
98
+ => CreateSubscriptionStream < TResponse > ( request , null ) ;
114
99
115
100
/// <inheritdoc />
116
- public IObservable < GraphQLResponse < TResponse > > CreateSubscriptionStream < TResponse > ( GraphQLRequest request , Action < Exception > exceptionHandler )
101
+ public IObservable < GraphQLResponse < TResponse > > CreateSubscriptionStream < TResponse > ( GraphQLRequest request , Action < Exception > ? exceptionHandler )
117
102
{
118
103
if ( _disposed )
119
104
throw new ObjectDisposedException ( nameof ( GraphQLHttpClient ) ) ;
120
-
121
- var key = new Tuple < GraphQLRequest , Type > ( request , typeof ( TResponse ) ) ;
122
-
123
- if ( _subscriptionStreams . ContainsKey ( key ) )
124
- return ( IObservable < GraphQLResponse < TResponse > > ) _subscriptionStreams [ key ] ;
125
-
105
+
126
106
var observable = GraphQlHttpWebSocket . CreateSubscriptionStream < TResponse > ( request , exceptionHandler ) ;
127
- _subscriptionStreams . TryAdd ( key , observable ) ;
128
107
return observable ;
129
108
}
130
109
@@ -140,24 +119,24 @@ public IObservable<GraphQLResponse<TResponse>> CreateSubscriptionStream<TRespons
140
119
141
120
private async Task < GraphQLHttpResponse < TResponse > > SendHttpRequestAsync < TResponse > ( GraphQLRequest request , CancellationToken cancellationToken = default )
142
121
{
143
- var preprocessedRequest = await Options . PreprocessRequest ( request , this ) ;
122
+ var preprocessedRequest = await Options . PreprocessRequest ( request , this ) . ConfigureAwait ( false ) ;
144
123
145
124
using var httpRequestMessage = preprocessedRequest . ToHttpRequestMessage ( Options , JsonSerializer ) ;
146
- using var httpResponseMessage = await HttpClient . SendAsync ( httpRequestMessage , HttpCompletionOption . ResponseHeadersRead , cancellationToken ) ;
125
+ using var httpResponseMessage = await HttpClient . SendAsync ( httpRequestMessage , HttpCompletionOption . ResponseHeadersRead , cancellationToken ) . ConfigureAwait ( false ) ;
147
126
148
- var contentStream = await httpResponseMessage . Content . ReadAsStreamAsync ( ) ;
127
+ var contentStream = await httpResponseMessage . Content . ReadAsStreamAsync ( ) . ConfigureAwait ( false ) ;
149
128
150
129
if ( httpResponseMessage . IsSuccessStatusCode )
151
130
{
152
- var graphQLResponse = await JsonSerializer . DeserializeFromUtf8StreamAsync < TResponse > ( contentStream , cancellationToken ) ;
131
+ var graphQLResponse = await JsonSerializer . DeserializeFromUtf8StreamAsync < TResponse > ( contentStream , cancellationToken ) . ConfigureAwait ( false ) ;
153
132
return graphQLResponse . ToGraphQLHttpResponse ( httpResponseMessage . Headers , httpResponseMessage . StatusCode ) ;
154
133
}
155
134
156
135
// error handling
157
136
string content = null ;
158
137
if ( contentStream != null )
159
138
using ( var sr = new StreamReader ( contentStream ) )
160
- content = await sr . ReadToEndAsync ( ) ;
139
+ content = await sr . ReadToEndAsync ( ) . ConfigureAwait ( false ) ;
161
140
162
141
throw new GraphQLHttpRequestException ( httpResponseMessage . StatusCode , httpResponseMessage . Headers , content ) ;
163
142
}
0 commit comments