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; } }
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(); } }