Beispiel #1
0
        private async Task <string> DownloadServerPackage(
            ServerBuildDownloadInfo serverInfo, CancellationToken token = default)
        {
            var pkgDownloadUrl   = $"{_downloadsS3BucketUrl}/{serverInfo.PackageFileName}";
            var downloadFilePath = Path.Combine(ServerDownloadPath, serverInfo.PackageDownloadFileName);
            var packageFilePath  = Path.Combine(ServerDownloadPath, serverInfo.PackageFileName);

            try
            {
                var response = await DownloadClient.GetAsync(pkgDownloadUrl, HttpCompletionOption.ResponseHeadersRead, token);

                if (response.IsSuccessStatusCode == false)
                {
                    var msg = await response.Content.ReadAsStringAsync();

                    throw new InvalidOperationException(
                              $"Error downloading {pkgDownloadUrl}: {response.StatusCode} {msg}");
                }

                using (var stream = await response.Content.ReadAsStreamAsync())
                {
                    using (var file = File.OpenWrite(downloadFilePath))
                    {
                        await stream.CopyToAsync(file, token);
                    }
                }

                File.Move(downloadFilePath, packageFilePath);

                return(packageFilePath);
            }
            catch (Exception)
            {
                if (File.Exists(downloadFilePath))
                {
                    IOExtensions.DeleteFile(downloadFilePath);
                }

                if (File.Exists(packageFilePath))
                {
                    IOExtensions.DeleteFile(packageFilePath);
                }

                throw;
            }
        }
Beispiel #2
0
        public async Task <string> GetServerPath(
            ServerBuildDownloadInfo serverInfo, CancellationToken token = default)
        {
            await _downloadQueueSemaphore.WaitAsync(token);

            var serverDirectory = serverInfo.GetServerDirectory(ServerDownloadPath);
            var packagePath     = Path.Combine(ServerDownloadPath, serverInfo.PackageFileName);

            try
            {
                if (Directory.Exists(serverDirectory))
                {
                    return(serverDirectory);
                }

                if (File.Exists(packagePath) == false)
                {
                    await DownloadServerPackage(serverInfo, token);
                }

                await UnpackServerPackage(packagePath, serverDirectory);

                return(serverDirectory);
            }
            catch (Exception)
            {
                if (File.Exists(packagePath))
                {
                    IOExtensions.DeleteFile(packagePath);
                }

                if (Directory.Exists(serverDirectory))
                {
                    IOExtensions.DeleteDirectory(serverDirectory);
                }

                throw;
            }
            finally
            {
                _downloadQueueSemaphore.Release();
            }
        }