diff --git a/DepotDownloader/ContentDownloader.cs b/DepotDownloader/ContentDownloader.cs index 7db9b10..e8e1c79 100644 --- a/DepotDownloader/ContentDownloader.cs +++ b/DepotDownloader/ContentDownloader.cs @@ -852,6 +852,8 @@ namespace DepotDownloader Console.Write("Downloading depot manifest..."); DepotManifest depotManifest = null; + ulong manifestRequestCode = 0; + var manifestRequestCodeExpiration = DateTime.MinValue; do { @@ -863,20 +865,27 @@ namespace DepotDownloader { connection = cdnPool.GetConnection(cts.Token); - // In order to download this manifest, we need the current manifest request code - // The manifest request code is time limited, so it must be retrieved on demand - // TODO: for retried requests, is there enough leeway to use a cached code? - var manifestRequestCode = await steam3.GetDepotManifestRequestCodeAsync( - depot.id, - depot.appId, - depot.manifestId, - depot.branch); + var now = DateTime.Now; - if (manifestRequestCode == 0) + // In order to download this manifest, we need the current manifest request code + // The manifest request code is only valid for a specific period in time + if (manifestRequestCode == 0 || now >= manifestRequestCodeExpiration) { - DebugLog.WriteLine("ContentDownloader", - "No manifest request code was returned for {0} {1}", - depot.id, depot.manifestId); + manifestRequestCode = await steam3.GetDepotManifestRequestCodeAsync( + depot.id, + depot.appId, + depot.manifestId, + depot.branch); + // This code will hopefully be valid for one period following the issuing period + manifestRequestCodeExpiration = now.Add(TimeSpan.FromMinutes(15)); + + // This will likely be a fatal error once the manifest code is enforced + if (manifestRequestCode == 0) + { + DebugLog.WriteLine("ContentDownloader", + "No manifest request code was returned for {0} {1}", + depot.id, depot.manifestId); + } } DebugLog.WriteLine("ContentDownloader",