private ValueTask <HttpConnection> GetOrCreateConnection(HttpRequestMessage request, Uri proxyUri, CancellationToken cancellationToken) { var key = new HttpConnectionKey(proxyUri); HttpConnectionPool pool = _connectionPools.GetOrAddPool(key); return(pool.GetConnectionAsync(async(state, ct) => { Stream stream = await ConnectHelper.ConnectAsync(state.proxyUri.IdnHost, state.proxyUri.Port, ct).ConfigureAwait(false); return new HttpConnection(state.pool, state.key, null, stream, null, true); }, (pool: pool, key: key, request: request, proxyUri: proxyUri), cancellationToken)); }
protected internal override Task <HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { var key = new HttpConnectionKey(request.RequestUri); HttpConnectionPool pool = _connectionPools.GetOrAddPool(key); ValueTask <HttpConnection> connectionTask = pool.GetConnectionAsync( state => state.handler.CreateConnection(state.request, state.key, state.pool), (handler: this, request: request, key: key, pool: pool)); return(connectionTask.IsCompletedSuccessfully ? connectionTask.Result.SendAsync(request, cancellationToken) : SendAsyncWithAwaitedConnection(connectionTask, request, cancellationToken)); }