Example #1
0
        /// <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);
            }
        }
Example #2
0
        /// <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);
            }
        }
Example #3
0
        /// <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);
            }
        }