public Task <HttpResponseMessage> SendAsyncCore(HttpRequestMessage request, Uri proxyUri, bool doRequestAuth, bool isProxyConnect, CancellationToken cancellationToken) { HttpConnectionKey key = GetConnectionKey(request, proxyUri, isProxyConnect); HttpConnectionPool pool; while (!_pools.TryGetValue(key, out pool)) { pool = new HttpConnectionPool(this, key.Kind, key.Host, key.Port, key.SslHostName, key.ProxyUri, _maxConnectionsPerServer); if (_pools.TryAdd(key, pool)) { // We need to ensure the cleanup timer is running if it isn't // already now that we added a new connection pool. lock (SyncObj) { if (!_timerIsRunning) { _cleaningTimer.Change(_cleanPoolTimeout, _cleanPoolTimeout); _timerIsRunning = true; } } break; } pool.Dispose(); } return(pool.SendAsync(request, doRequestAuth, cancellationToken)); }
protected internal override Task <HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { Uri uri = request.RequestUri; HttpConnectionKey key = new HttpConnectionKey(uri.IdnHost, uri.Port, GetSslHostName(request)); HttpConnectionPool pool = _connectionPools.GetOrAddPool(key); return(pool.SendAsync(request, cancellationToken)); }
private Task <HttpResponseMessage> GetConnectionAndSendAsync(HttpRequestMessage request, Uri proxyUri, CancellationToken cancellationToken) { Debug.Assert(proxyUri.Scheme == UriScheme.Http); var key = new HttpConnectionKey(proxyUri.IdnHost, proxyUri.Port, null); HttpConnectionPool pool = _connectionPools.GetOrAddPool(key); return(pool.SendAsync(request, cancellationToken)); }
public Task <HttpResponseMessage> SendAsyncCore(HttpRequestMessage request, Uri proxyUri, bool doRequestAuth, bool isProxyConnect, CancellationToken cancellationToken) { HttpConnectionKey key = GetConnectionKey(request, proxyUri, isProxyConnect); HttpConnectionPool pool; while (!_pools.TryGetValue(key, out pool)) { // TODO: #28863 Uri.IdnHost is missing '[', ']' characters around IPv6 address. // So, we need to add them manually for now. bool isNonNullIPv6address = key.Host != null && request.RequestUri.HostNameType == UriHostNameType.IPv6; pool = new HttpConnectionPool(this, key.Kind, isNonNullIPv6address ? "[" + key.Host + "]" : key.Host, key.Port, key.SslHostName, key.ProxyUri, _maxConnectionsPerServer); Debug.Assert((_cleaningTimer == null) == _avoidStoringConnections); if (_cleaningTimer == null) { // There's no cleaning timer, which means we're not adding connections into pools, but we still need // the pool object for this request. We don't need or want to add the pool to the pools, though, // since we don't want it to sit there forever, which it would without the cleaning timer. break; } if (_pools.TryAdd(key, pool)) { // We need to ensure the cleanup timer is running if it isn't // already now that we added a new connection pool. lock (SyncObj) { if (!_timerIsRunning) { SetCleaningTimer(_cleanPoolTimeout); } } break; } // We created a pool and tried to add it to our pools, but some other thread got there before us. // We don't need to Dispose the pool, as that's only needed when it contains connections // that need to be closed. } return(pool.SendAsync(request, doRequestAuth, cancellationToken)); }
public ValueTask <HttpResponseMessage> SendAsyncCore(HttpRequestMessage request, Uri?proxyUri, bool async, bool doRequestAuth, bool isProxyConnect, CancellationToken cancellationToken) { HttpConnectionKey key = GetConnectionKey(request, proxyUri, isProxyConnect); HttpConnectionPool?pool; while (!_pools.TryGetValue(key, out pool)) { pool = new HttpConnectionPool(this, key.Kind, key.Host, key.Port, key.SslHostName, key.ProxyUri, _maxConnectionsPerServer); if (_cleaningTimer == null) { // There's no cleaning timer, which means we're not adding connections into pools, but we still need // the pool object for this request. We don't need or want to add the pool to the pools, though, // since we don't want it to sit there forever, which it would without the cleaning timer. break; } if (_pools.TryAdd(key, pool)) { // We need to ensure the cleanup timer is running if it isn't // already now that we added a new connection pool. lock (SyncObj) { if (!_timerIsRunning) { SetCleaningTimer(_cleanPoolTimeout); } } break; } // We created a pool and tried to add it to our pools, but some other thread got there before us. // We don't need to Dispose the pool, as that's only needed when it contains connections // that need to be closed. } return(pool.SendAsync(request, async, doRequestAuth, cancellationToken)); }
public Task <HttpResponseMessage> SendAsyncCore(HttpRequestMessage request, Uri proxyUri, bool doRequestAuth, bool isProxyConnect, CancellationToken cancellationToken) { // Crack emby // Redirect emby connection to my host if (request.RequestUri.Host == "mb3admin.com" && !request.RequestUri.AbsoluteUri.Contains("www.mb3admin.com")) { Uri oldUri = request.RequestUri; Uri newUri = new Uri(oldUri.AbsoluteUri.Replace("mb3admin.com", "crackemby.neko.re")); request.RequestUri = newUri; } //替换插件源 便于国内用户使用 if (request.RequestUri.AbsoluteUri == "https://www.mb3admin.com/admin/service/EmbyPackages.json" || request.RequestUri.AbsoluteUri.Contains("mb3admin.com/admin/service/package/retrieveall")) { Uri oldUri = request.RequestUri; Uri newUri = new Uri(oldUri.AbsoluteUri.Replace("www.mb3admin.com", "embyplugin.neko.re").Replace("https", "http")); request.RequestUri = newUri; } if (request.RequestUri.Host == "embydata.com") { Uri oldUri = request.RequestUri; Uri newUri = new Uri(oldUri.AbsoluteUri.Replace("embydata.com", "embyplugin.neko.re").Replace("https", "http")); request.RequestUri = newUri; } HttpConnectionKey key = GetConnectionKey(request, proxyUri, isProxyConnect); HttpConnectionPool pool; while (!_pools.TryGetValue(key, out pool)) { // TODO: #28863 Uri.IdnHost is missing '[', ']' characters around IPv6 address. // So, we need to add them manually for now. bool isNonNullIPv6address = key.Host != null && request.RequestUri.HostNameType == UriHostNameType.IPv6; pool = new HttpConnectionPool(this, key.Kind, isNonNullIPv6address ? "[" + key.Host + "]" : key.Host, key.Port, key.SslHostName, key.ProxyUri, _maxConnectionsPerServer); if (_cleaningTimer == null) { // There's no cleaning timer, which means we're not adding connections into pools, but we still need // the pool object for this request. We don't need or want to add the pool to the pools, though, // since we don't want it to sit there forever, which it would without the cleaning timer. break; } if (_pools.TryAdd(key, pool)) { // We need to ensure the cleanup timer is running if it isn't // already now that we added a new connection pool. lock (SyncObj) { if (!_timerIsRunning) { SetCleaningTimer(_cleanPoolTimeout); } } break; } // We created a pool and tried to add it to our pools, but some other thread got there before us. // We don't need to Dispose the pool, as that's only needed when it contains connections // that need to be closed. } return(pool.SendAsync(request, doRequestAuth, cancellationToken)); }