@@ -40,23 +40,22 @@ internal class WebProxy : IWebProxy
40
40
/// <summary> The default IConnection implementation. Uses <see cref="HttpClient" />.</summary>
41
41
public class HttpConnection : IConnection
42
42
{
43
- private static DiagnosticSource DiagnosticSource { get ; } = new DiagnosticListener ( DiagnosticSources . HttpConnection . SourceName ) ;
44
-
45
43
private static readonly string MissingConnectionLimitMethodError =
46
44
$ "Your target platform does not support { nameof ( ConnectionConfiguration . ConnectionLimit ) } "
47
45
+ $ " please set { nameof ( ConnectionConfiguration . ConnectionLimit ) } to -1 on your connection configuration/settings."
48
46
+ $ " this will cause the { nameof ( HttpClientHandler . MaxConnectionsPerServer ) } not to be set on { nameof ( HttpClientHandler ) } ";
49
47
50
- private RequestDataHttpClientFactory HttpClientFactory { get ; }
51
-
52
48
[ Obsolete ( "HttpConnection now uses a HttpClientFactory implementation to manage HttpClient and HttpMessageHandler instances. "
53
49
+ "This property is no longer used and will be removed in the next major release" ) ]
54
50
protected readonly ConcurrentDictionary < int , HttpClient > Clients = new ConcurrentDictionary < int , HttpClient > ( ) ;
55
51
52
+ public HttpConnection ( ) => HttpClientFactory = new RequestDataHttpClientFactory ( r => CreateHttpClientHandler ( r ) ) ;
53
+
56
54
public int InUseHandlers => HttpClientFactory . InUseHandlers ;
57
55
public int RemovedHandlers => HttpClientFactory . RemovedHandlers ;
56
+ private static DiagnosticSource DiagnosticSource { get ; } = new DiagnosticListener ( DiagnosticSources . HttpConnection . SourceName ) ;
58
57
59
- public HttpConnection ( ) => HttpClientFactory = new RequestDataHttpClientFactory ( r => CreateHttpClientHandler ( r ) ) ;
58
+ private RequestDataHttpClientFactory HttpClientFactory { get ; }
60
59
61
60
public virtual TResponse Request < TResponse > ( RequestData requestData )
62
61
where TResponse : class , IElasticsearchResponse , new ( )
@@ -80,7 +79,7 @@ public virtual TResponse Request<TResponse>(RequestData requestData)
80
79
if ( requestData . PostData != null )
81
80
SetContent ( requestMessage , requestData ) ;
82
81
83
- using ( requestMessage ? . Content ?? ( IDisposable ) Stream . Null )
82
+ using ( requestMessage ? . Content ?? ( IDisposable ) Stream . Null )
84
83
using ( var d = DiagnosticSource . Diagnose < RequestData , int ? > ( DiagnosticSources . HttpConnection . SendAndReceiveHeaders , requestData ) )
85
84
{
86
85
if ( requestData . TcpStats )
@@ -113,10 +112,11 @@ public virtual TResponse Request<TResponse>(RequestData requestData)
113
112
{
114
113
ex = e ;
115
114
}
116
- using ( receive )
115
+ using ( receive )
117
116
using ( responseStream ??= Stream . Null )
118
117
{
119
- var response = ResponseBuilder . ToResponse < TResponse > ( requestData , ex , statusCode , warnings , responseStream , mimeType , productNames ? . FirstOrDefault ( ) ) ;
118
+ var response = ResponseBuilder . ToResponse < TResponse > ( requestData , ex , statusCode , warnings , responseStream ,
119
+ productNames ? . FirstOrDefault ( ) , mimeType ) ;
120
120
121
121
// set TCP and threadpool stats on the response here so that in the event the request fails after the point of
122
122
// gathering stats, they are still exposed on the call details. Ideally these would be set inside ResponseBuilder.ToResponse,
@@ -150,7 +150,7 @@ public virtual async Task<TResponse> RequestAsync<TResponse>(RequestData request
150
150
if ( requestData . PostData != null )
151
151
await SetContentAsync ( requestMessage , requestData , cancellationToken ) . ConfigureAwait ( false ) ;
152
152
153
- using ( requestMessage ? . Content ?? ( IDisposable ) Stream . Null )
153
+ using ( requestMessage ? . Content ?? ( IDisposable ) Stream . Null )
154
154
using ( var d = DiagnosticSource . Diagnose < RequestData , int ? > ( DiagnosticSources . HttpConnection . SendAndReceiveHeaders , requestData ) )
155
155
{
156
156
if ( requestData . TcpStats )
@@ -159,7 +159,8 @@ public virtual async Task<TResponse> RequestAsync<TResponse>(RequestData request
159
159
if ( requestData . ThreadPoolStats )
160
160
threadPoolStats = ThreadPoolStats . GetStats ( ) ;
161
161
162
- responseMessage = await client . SendAsync ( requestMessage , HttpCompletionOption . ResponseHeadersRead , cancellationToken ) . ConfigureAwait ( false ) ;
162
+ responseMessage = await client . SendAsync ( requestMessage , HttpCompletionOption . ResponseHeadersRead , cancellationToken )
163
+ . ConfigureAwait ( false ) ;
163
164
statusCode = ( int ) responseMessage . StatusCode ;
164
165
d . EndState = statusCode ;
165
166
}
@@ -187,7 +188,7 @@ public virtual async Task<TResponse> RequestAsync<TResponse>(RequestData request
187
188
using ( responseStream ??= Stream . Null )
188
189
{
189
190
var response = await ResponseBuilder . ToResponseAsync < TResponse >
190
- ( requestData , ex , statusCode , warnings , responseStream , mimeType , productNames ? . FirstOrDefault ( ) , cancellationToken )
191
+ ( requestData , ex , statusCode , warnings , responseStream , productNames ? . FirstOrDefault ( ) , mimeType , cancellationToken )
191
192
. ConfigureAwait ( false ) ;
192
193
193
194
// set TCP and thread pool stats on the response here so that in the event the request fails after the point of
@@ -209,7 +210,6 @@ protected virtual HttpMessageHandler CreateHttpClientHandler(RequestData request
209
210
210
211
// same limit as desktop clr
211
212
if ( requestData . ConnectionSettings . ConnectionLimit > 0 )
212
- {
213
213
try
214
214
{
215
215
handler . MaxConnectionsPerServer = requestData . ConnectionSettings . ConnectionLimit ;
@@ -222,7 +222,6 @@ protected virtual HttpMessageHandler CreateHttpClientHandler(RequestData request
222
222
{
223
223
throw new Exception ( MissingConnectionLimitMethodError , e ) ;
224
224
}
225
- }
226
225
227
226
if ( ! requestData . ProxyAddress . IsNullOrEmpty ( ) )
228
227
{
@@ -291,7 +290,6 @@ protected virtual bool SetApiKeyAuthenticationIfNeeded(HttpRequestMessage reques
291
290
292
291
requestMessage . Headers . Authorization = new AuthenticationHeaderValue ( "ApiKey" , apiKey ) ;
293
292
return true ;
294
-
295
293
}
296
294
297
295
// TODO - make private in 8.0 and only expose SetAuthenticationIfNeeded
@@ -401,7 +399,7 @@ private static async Task SetContentAsync(HttpRequestMessage message, RequestDat
401
399
await stream . DisposeAsync ( ) . ConfigureAwait ( false ) ;
402
400
403
401
#else
404
- stream . Dispose ( ) ;
402
+ stream . Dispose ( ) ;
405
403
#endif
406
404
}
407
405
else
0 commit comments