diff --git a/DepotDownloader/CDNClientPool.cs b/DepotDownloader/CDNClientPool.cs index 485bbcd2..aab33c9e 100644 --- a/DepotDownloader/CDNClientPool.cs +++ b/DepotDownloader/CDNClientPool.cs @@ -1,11 +1,10 @@ -using System; +using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; -using System.Net; using System.Threading; using System.Threading.Tasks; -using SteamKit2; +using SteamKit2.CDN; namespace DepotDownloader { @@ -18,11 +17,11 @@ namespace DepotDownloader private readonly Steam3Session steamSession; private readonly uint appId; - public CDNClient CDNClient { get; } - public CDNClient.Server ProxyServer { get; private set; } + public Client CDNClient { get; } + public Server ProxyServer { get; private set; } - private readonly ConcurrentStack activeConnectionPool; - private readonly BlockingCollection availableServerEndpoints; + private readonly ConcurrentStack activeConnectionPool; + private readonly BlockingCollection availableServerEndpoints; private readonly AutoResetEvent populatePoolEvent; private readonly Task monitorTask; @@ -33,10 +32,10 @@ namespace DepotDownloader { this.steamSession = steamSession; this.appId = appId; - CDNClient = new CDNClient(steamSession.steamClient); + CDNClient = new Client(steamSession.steamClient); - activeConnectionPool = new ConcurrentStack(); - availableServerEndpoints = new BlockingCollection(); + activeConnectionPool = new ConcurrentStack(); + availableServerEndpoints = new BlockingCollection(); populatePoolEvent = new AutoResetEvent(true); shutdownToken = new CancellationTokenSource(); @@ -50,32 +49,20 @@ namespace DepotDownloader monitorTask.Wait(); } - private async Task> FetchBootstrapServerListAsync() + private async Task> FetchBootstrapServerListAsync() { - var backoffDelay = 0; - - while (!shutdownToken.IsCancellationRequested) + try { - try + var cdnServers = await this.steamSession.steamContent.GetServersForSteamPipe(); + if (cdnServers != null) { - var cdnServers = await ContentServerDirectoryService.LoadAsync(this.steamSession.steamClient.Configuration, ContentDownloader.Config.CellID, shutdownToken.Token); - if (cdnServers != null) - { - return cdnServers; - } - } - catch (Exception ex) - { - Console.WriteLine("Failed to retrieve content server list: {0}", ex.Message); - - if (ex is SteamKitWebRequestException e && e.StatusCode == (HttpStatusCode)429) - { - // If we're being throttled, add a delay to the next request - backoffDelay = Math.Min(5, ++backoffDelay); - await Task.Delay(TimeSpan.FromSeconds(backoffDelay)); - } + return cdnServers; } } + catch (Exception ex) + { + Console.WriteLine("Failed to retrieve content server list: {0}", ex.Message); + } return null; } @@ -104,7 +91,7 @@ namespace DepotDownloader var weightedCdnServers = servers .Where(server => { - var isEligibleForApp = server.AllowedAppIds == null || server.AllowedAppIds.Contains(appId); + var isEligibleForApp = server.AllowedAppIds.Length == 0 || server.AllowedAppIds.Contains(appId); return isEligibleForApp && (server.Type == "SteamCache" || server.Type == "CDN"); }) .Select(server => @@ -133,7 +120,7 @@ namespace DepotDownloader } } - private CDNClient.Server BuildConnection(CancellationToken token) + private Server BuildConnection(CancellationToken token) { if (availableServerEndpoints.Count < ServerEndpointMinimumSize) { @@ -143,7 +130,7 @@ namespace DepotDownloader return availableServerEndpoints.Take(token); } - public CDNClient.Server GetConnection(CancellationToken token) + public Server GetConnection(CancellationToken token) { if (!activeConnectionPool.TryPop(out var connection)) { @@ -153,7 +140,7 @@ namespace DepotDownloader return connection; } - public async Task AuthenticateConnection(uint appId, uint depotId, CDNClient.Server server) + public async Task AuthenticateConnection(uint appId, uint depotId, Server server) { var host = steamSession.ResolveCDNTopLevelHost(server.Host); var cdnKey = $"{depotId:D}:{host}"; @@ -169,14 +156,14 @@ namespace DepotDownloader throw new Exception($"Failed to retrieve CDN token for server {server.Host} depot {depotId}"); } - public void ReturnConnection(CDNClient.Server server) + public void ReturnConnection(Server server) { if (server == null) return; activeConnectionPool.Push(server); } - public void ReturnBrokenConnection(CDNClient.Server server) + public void ReturnBrokenConnection(Server server) { if (server == null) return; diff --git a/DepotDownloader/ContentDownloader.cs b/DepotDownloader/ContentDownloader.cs index c9b2d358..4eff4301 100644 --- a/DepotDownloader/ContentDownloader.cs +++ b/DepotDownloader/ContentDownloader.cs @@ -4,10 +4,10 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; -using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; using SteamKit2; +using SteamKit2.CDN; namespace DepotDownloader { @@ -831,15 +831,15 @@ namespace DepotDownloader { cts.Token.ThrowIfCancellationRequested(); - CDNClient.Server connection = null; + Server connection = null; try { connection = cdnPool.GetConnection(cts.Token); DebugLog.WriteLine("ContentDownloader", "Downloading manifest {0} from {1} with {2}", depot.manifestId, connection, cdnPool.ProxyServer != null ? cdnPool.ProxyServer : "no proxy"); - depotManifest = await cdnPool.CDNClient.DownloadManifestAsync(depot.id, depot.manifestId, - connection, null, depot.depotKey, proxyServer: cdnPool.ProxyServer).ConfigureAwait(false); + depotManifest = await cdnPool.CDNClient.DownloadManifestAsync(depot.id, depot.manifestId, manifestRequestCode: 0, + connection, depot.depotKey, cdnPool.ProxyServer).ConfigureAwait(false); cdnPool.ReturnConnection(connection); } @@ -1223,13 +1223,13 @@ namespace DepotDownloader data.CompressedLength = chunk.CompressedLength; data.UncompressedLength = chunk.UncompressedLength; - CDNClient.DepotChunk chunkData = null; + DepotChunk chunkData = null; do { cts.Token.ThrowIfCancellationRequested(); - CDNClient.Server connection = null; + Server connection = null; try { @@ -1237,7 +1237,7 @@ namespace DepotDownloader DebugLog.WriteLine("ContentDownloader", "Downloading chunk {0} from {1} with {2}", chunkID, connection, cdnPool.ProxyServer != null ? cdnPool.ProxyServer : "no proxy"); chunkData = await cdnPool.CDNClient.DownloadDepotChunkAsync(depot.id, data, - connection, null, depot.depotKey, proxyServer: cdnPool.ProxyServer).ConfigureAwait(false); + connection, depot.depotKey, cdnPool.ProxyServer).ConfigureAwait(false); cdnPool.ReturnConnection(connection); } diff --git a/DepotDownloader/Steam3Session.cs b/DepotDownloader/Steam3Session.cs index d669dc76..c2c24dcf 100644 --- a/DepotDownloader/Steam3Session.cs +++ b/DepotDownloader/Steam3Session.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; @@ -40,6 +40,7 @@ namespace DepotDownloader public SteamClient steamClient; public SteamUser steamUser; + public SteamContent steamContent; readonly SteamApps steamApps; readonly SteamCloud steamCloud; readonly SteamUnifiedMessages.UnifiedService steamPublishedFile; @@ -101,6 +102,7 @@ namespace DepotDownloader this.steamCloud = this.steamClient.GetHandler(); var steamUnifiedMessages = this.steamClient.GetHandler(); this.steamPublishedFile = steamUnifiedMessages.CreateService(); + this.steamContent = this.steamClient.GetHandler(); this.callbacks = new CallbackManager(this.steamClient);