/// <summary> /// Compress an ErrorReport as JSON string /// </summary> /// <param name="errorReport">ErrorReport</param> /// <returns>Compressed JSON representation of the ErrorReport.</returns> internal byte[] CompressErrorReport(UploadToScreenshotsDTO errorReport) { var reportJson = JsonConvert.SerializeObject(errorReport, Formatting.None, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.None, //ContractResolver = // new IncludeNonPublicMembersContractResolver() }); var buffer = Encoding.UTF8.GetBytes(reportJson); //collected by GZipStream var outMs = new MemoryStream(); using (var zipStream = new GZipStream(outMs, CompressionMode.Compress)) { zipStream.Write(buffer, 0, buffer.Length); //MUST close the stream, flush doesn't help and without close // the memory stream won't get its bytes zipStream.Close(); var result = outMs.ToArray(); return(result); } }
/// <summary> /// Upload the report to the web service. /// </summary> /// <param name="report">CreateReport to submit</param> public void UploadReport(UploadToScreenshotsDTO report) { if (report == null) { throw new ArgumentNullException("report"); } if (!NetworkInterface.GetIsNetworkAvailable() || _queueReportsAccessor()) { _reportQueue.Add(report); } else { TryUploadReportNow(report); } }
/// <summary> /// Try to upload a report directly /// </summary> /// <param name="report">Report to upload</param> /// <exception cref="WebException">No internet connection is available; Destination server did not accept the report.</exception> public void TryUploadReportNow(UploadToScreenshotsDTO report) { if (!NetworkInterface.GetIsNetworkAvailable()) { throw new WebException("Not connected, try again later.", WebExceptionStatus.ConnectFailure); } var buffer = CompressErrorReport(report); var version = Assembly.GetExecutingAssembly().GetName().Version.ToString(2); var hashAlgo = new HMACSHA256(Encoding.UTF8.GetBytes(_sharedSecret)); var hash = hashAlgo.ComputeHash(buffer); var signature = Convert.ToBase64String(hash); try { ExecuteRetryer retryer = new ExecuteRetryer(20, 300); retryer.Execute(() => { var uri = _reportUri + "?sig=" + signature + "&v=" + version; var request = (HttpWebRequest)WebRequest.Create(uri); AddProxyIfRequired(request, uri); request.Method = "POST"; request.ContentType = "application/octet-stream"; var evt = request.BeginGetRequestStream(null, null); var stream = request.EndGetRequestStream(evt); stream.Write(buffer, 0, buffer.Length); var responseRes = request.BeginGetResponse(null, null); var response = (HttpWebResponse)request.EndGetResponse(responseRes); using (response) { //Console.WriteLine(response); } }); } catch (Exception err) { AnalyzeException(err); throw new WebException( "The actual upload failed (probably network error). We'll try again later..", err); } }