private async Task <HttpResponseMessage> CommitS3CrashUpload(MinidumpPostOptions options, string s3Key, string md5) { using (var httpClient = new HttpClient()) { var route = $"{baseUrl}/api/commitS3CrashUpload"; var crashTypeId = options?.MinidumpType != MinidumpTypeId.Unknown ? options.MinidumpType : MinidumpType; var body = CreateMultiPartFormDataContent(options); body.Add(new StringContent($"{(int)crashTypeId}"), "crashTypeId"); body.Add(new StringContent(s3Key), "s3Key"); body.Add(new StringContent(md5), "md5"); return(await httpClient.PostAsync(route, body)); } }
private byte[] CreateInMemoryCrashZipFile(FileInfo minidumpFileInfo, MinidumpPostOptions options) { var files = new List <InMemoryFile>(); files.Add(new InMemoryFile() { FileName = minidumpFileInfo.Name, Content = File.ReadAllBytes(minidumpFileInfo.FullName) }); foreach (var attachment in options.AdditionalAttachments) { files.Add(new InMemoryFile() { FileName = attachment.Name, Content = File.ReadAllBytes(attachment.FullName) }); } byte[] zipBytes; using (var archiveStream = new MemoryStream()) { using (var archive = new ZipArchive(archiveStream, ZipArchiveMode.Create, true)) { foreach (var file in files) { var zipArchiveEntry = archive.CreateEntry(file.FileName, CompressionLevel.Fastest); using (var zipStream = zipArchiveEntry.Open()) { zipStream.Write(file.Content, 0, file.Content.Length); } } } zipBytes = archiveStream.ToArray(); } return(zipBytes); }
/// <summary> /// Post a minidump file to BugSplat /// </summary> /// <param name="ex">The minidump file that will be posted to BugSplat</param> /// <param name="options">Optional parameters that will override the defaults if provided</param> public async Task <HttpResponseMessage> Post(FileInfo minidumpFileInfo, MinidumpPostOptions options = null) { ThrowIfArgumentIsNull(minidumpFileInfo, "minidumpFileInfo"); options = options ?? new MinidumpPostOptions(); var zipBytes = CreateInMemoryCrashZipFile(minidumpFileInfo, options); var crashUploadResponse = await GetCrashUploadUrl(zipBytes.Length); ThrowIfHttpRequestFailed(crashUploadResponse); var presignedUrl = await ParseCrashUploadUrl(crashUploadResponse); var uploadFileResponse = await UploadFileToPresignedURL(presignedUrl, zipBytes); ThrowIfHttpRequestFailed(uploadFileResponse); var md5 = GetETagFromResponseHeaders(uploadFileResponse.Headers); var commitS3CrashResponse = await CommitS3CrashUpload(options, presignedUrl.ToString(), md5); ThrowIfHttpRequestFailed(commitS3CrashResponse); return(commitS3CrashResponse); }