public async static Task <byte[]> ZlibDecompressAsync(this ReadOnlyMemory <byte> bytesToDecompress) { using var inputStream = new MemoryStream(); await inputStream.WriteAsync(bytesToDecompress); using var outputStream = new MemoryStream(); inputStream.Position = 0; using var decompressionStream = new InflaterInputStream(inputStream); await decompressionStream.CopyToAsync(outputStream); return(outputStream.ToArray()); }
private async Task DownloadGroup(IEnumerable <ManifestFile> group, Dictionary <string, PackageFile> manifest) { foreach (var mFile in group) { var ext = mFile.MetaData.Type > FileType.NORMAL_FILE ? ".compressed" : ""; var url = $"/projects/{project}/releases/{mFile.MetaData.Version}/files/{mFile.FullName.Replace('\\', '/')}{ext}"; PackageFile pFile; if (!manifest.TryGetValue(url, out pFile)) { throw new Exception("404"); } var binUrl = $"projects/{project}/releases/{version}/packages/files/{pFile.BinName}"; while (true) { var req = WebRequest.CreateHttp(new Uri(region.UpdateBase, binUrl)); req.AddRange(pFile.Offset, pFile.Offset + pFile.Length - 1); try { using (var res = await req.GetResponseAsync()) using (var src = res.GetResponseStream()) { using (var save = this.GetStream(mFile, true)) { long start = save.Position; if (mFile.MetaData.Type > FileType.NORMAL_FILE && mFile.MetaData.Type != FileType.COMPRESSED_ARCHIVE) { using (var wrap = new InflaterInputStream(src)) await wrap.CopyToAsync(save); } else { await src.CopyToAsync(save); } if (save.Position - start != mFile.CompletedSize) { throw new Exception("File not properly downloaded: " + mFile.FullName); } } } break; } catch (ZipException) { } catch (IOException) { } } Interlocked.Add(ref patchingDone, mFile.CompletedSize); } }