Ejemplo n.º 1
0
 /// <summary>
 /// Obeys the payload timeout.
 /// </summary>
 /// <param name="payloadBundle">The payload bundle.</param>
 /// <param name="queue">The queue.</param>
 private void ObeyPayloadTimeout(PayloadBundle payloadBundle, PayloadQueue queue)
 {
     if (payloadBundle.TimeoutAt.HasValue && (DateTime.Now.Add(this._sleepInterval) >= payloadBundle.TimeoutAt.Value))
     {
         queue.Dequeue();
     }
 }
        /// <summary>
        /// Serializes the payload as json string.
        /// </summary>
        /// <param name="payloadBundle">The payload bundle.</param>
        /// <returns>System.Nullable&lt;System.String&gt;.</returns>
        private string?SerializePayloadAsJsonString(PayloadBundle payloadBundle)
        {
            Payload?payload = payloadBundle.GetPayload();

            string jsonData;

            try
            {
                jsonData = JsonConvert.SerializeObject(payload);
            }
            catch (System.Exception exception)
            {
                RollbarErrorUtility.Report(
                    this._rollbarLogger,
                    payload,
                    InternalRollbarError.PayloadSerializationError,
                    "While serializing a payload...",
                    exception,
                    payloadBundle
                    );

                return(null);
            }

            return(jsonData);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Enqueues the specified payload.
        /// </summary>
        /// <param name="payload">The payload.</param>
        public void Enqueue(PayloadBundle payload)
        {
            Assumption.AssertNotNull(payload, nameof(payload));

            if (payload == null)
            {
                return; // no one needs to enqueue "nothing"...
            }

            lock (this._syncLock)
            {
                if (RollbarInfrastructure.Instance.Config.RollbarInfrastructureOptions.ReportingQueueDepth == this._queue.Count)
                {
                    this._queue.Dequeue();
                }
                this._queue.Enqueue(payload);
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Builds the payload record.
        /// </summary>
        /// <param name="payloadBundle">The payload bundle.</param>
        /// <param name="payloadQueue">The payload queue.</param>
        /// <returns>PayloadRecord.</returns>
        private IPayloadRecord?BuildPayloadRecord(PayloadBundle payloadBundle, PayloadQueue payloadQueue)
        {
            try
            {
                if (payloadBundle.Ignorable ||
                    payloadBundle.GetPayload() == null ||
                    !payloadQueue.Client.EnsureHttpContentToSend(payloadBundle)
                    )
                {
                    return(null);
                }

                if (payloadBundle.AsHttpContentToSend == null)
                {
                    return(null);
                }

                Task <string> task = payloadBundle.AsHttpContentToSend.ReadAsStringAsync();
                task.Wait();
                string  payloadContent = task.Result;
                Payload?payload        = payloadBundle.GetPayload();

                if (payload != null && !string.IsNullOrWhiteSpace(payloadContent))
                {
                    return(_storeRepository?.CreatePayloadRecord(payload, payloadContent));
                }
                else
                {
                    return(null);
                }
            }
            catch (System.Exception ex)
            {
                RollbarErrorUtility.Report(
                    payloadQueue.Logger,
                    payloadBundle.GetPayload(),
                    InternalRollbarError.PersistentPayloadRecordError,
                    "While attempting to build persistent payload record...",
                    ex,
                    null
                    );
                return(null);
            }
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Scrubs the HTTP messages.
        /// </summary>
        /// <param name="payloadBundle">The payload bundle.</param>
        /// <returns><c>true</c> if scrubbed successfully, <c>false</c> otherwise.</returns>
        public bool ScrubHttpMessages(PayloadBundle payloadBundle)
        {
            Payload?payload = payloadBundle.GetPayload();

            if (payload == null)
            {
                return(true);
            }

            DTOs.Request?request = payload.Data.Request;
            if (request?.PostBody is string requestBody &&
                request.Headers != null &&
                request.Headers.TryGetValue("Content-Type", out string?requestContentTypeHeader)
                )
            {
                request.PostBody =
                    this.ScrubHttpMessageBodyContentString(
                        requestBody,
                        requestContentTypeHeader,
                        this.ScrubMask,
                        this.PayloadFieldNames,
                        this.HttpRequestBodyPaths);
            }

            DTOs.Response?response = payload.Data.Response;
            if (response?.Body is string responseBody &&
                response.Headers != null &&
                response.Headers.TryGetValue("Content-Type", out string?responseContentTypeHeader)
                )
            {
                response.Body =
                    this.ScrubHttpMessageBodyContentString(
                        responseBody,
                        responseContentTypeHeader,
                        this.ScrubMask,
                        this.PayloadFieldNames,
                        this.HttpResponseBodyPaths);
            }

            return(true);
        }
        /// <summary>
        /// Post as json as an asynchronous operation.
        /// </summary>
        /// <param name="payloadBundle">The payload bundle.</param>
        /// <param name="cancellationToken">
        /// The cancellation token that can be used by other objects or threads to receive notice of cancellation.
        /// </param>
        /// <returns>A Task&lt;RollbarResponse&gt; representing the asynchronous operation.</returns>
        public async Task <RollbarResponse?> PostAsJsonAsync(
            PayloadBundle payloadBundle,
            CancellationToken?cancellationToken = null
            )
        {
            Assumption.AssertNotNull(payloadBundle, nameof(payloadBundle));

            // make sure there anything meaningful to send:
            if (string.IsNullOrWhiteSpace(this._rollbarLoggerConfig.RollbarDestinationOptions.AccessToken) ||
                !EnsureHttpContentToSend(payloadBundle)
                )
            {
                return(null);
            }

            return(await PostAsJsonAsync(
                       this._rollbarLoggerConfig.RollbarDestinationOptions.AccessToken !,
                       payloadBundle.AsHttpContentToSend !,
                       cancellationToken
                       ));
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Posts as json.
        /// </summary>
        /// <param name="payloadBundle">The payload bundle.</param>
        /// <returns>System.Nullable&lt;RollbarResponse&gt;.</returns>
        /// <exception cref="System.Net.Http.HttpRequestException">Preliminary ConnectivityMonitor detected offline status!</exception>
        public RollbarResponse?PostAsJson(
            PayloadBundle payloadBundle
            )
        {
            Assumption.AssertNotNull(payloadBundle, nameof(payloadBundle));

            // first, let's run quick Internet availability check
            // to minimize potential timeout of the following JSON POST call:
            if (RollbarConnectivityMonitor.Instance != null &&
                !RollbarConnectivityMonitor.Instance.IsConnectivityOn
                )
            {
                throw new HttpRequestException("Preliminary ConnectivityMonitor detected offline status!");
            }

            using CancellationTokenSource cancellationTokenSource = new();
            var task = this.PostAsJsonAsync(payloadBundle, cancellationTokenSource.Token);

            try
            {
                if (!task.Wait(this._expectedPostToApiTimeout))
                {
                    cancellationTokenSource.Cancel(true);
                }
                return(task.Result);
            }
            catch (System.Exception ex)
            {
                RollbarErrorUtility.Report(
                    null,
                    payloadBundle.AsHttpContentToSend,
                    InternalRollbarError.PayloadPostError,
                    "While PostAsJson(PayloadBundle payloadBundle)...",
                    ex,
                    payloadBundle
                    );
                return(null);
            }
        }
        /// <summary>
        /// Ensures the HTTP content to send.
        /// </summary>
        /// <param name="payloadBundle">The payload bundle.</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
        public bool EnsureHttpContentToSend(PayloadBundle payloadBundle)
        {
            if (payloadBundle.AsHttpContentToSend != null)
            {
                return(true);
            }

            Payload?payload = payloadBundle.GetPayload();

            Assumption.AssertNotNull(payload, nameof(payload));

            if (this._payloadTruncator == null ||
                !this._payloadTruncator.TruncatePayload(payloadBundle)
                )
            {
                return(false);
            }

            if (this._payloadScrubber == null ||
                !this._payloadScrubber.ScrubHttpMessages(payloadBundle)
                )
            {
                return(false);
            }

            string?jsonData = SerializePayloadAsJsonString(payloadBundle);

            if (string.IsNullOrWhiteSpace(jsonData))
            {
                return(false);
            }

            try
            {
                jsonData = this._payloadScrubber.ScrubPayload(jsonData !);
            }
            catch (System.Exception exception)
            {
                RollbarErrorUtility.Report(
                    this._rollbarLogger,
                    payload,
                    InternalRollbarError.PayloadScrubbingError,
                    "While scrubbing a payload...",
                    exception,
                    payloadBundle
                    );

                return(false);
            }

            payloadBundle.AsHttpContentToSend =
                new StringContent(jsonData, Encoding.UTF8, "application/json"); //CONTENT-TYPE header

            Assumption.AssertNotNull(
                payloadBundle.AsHttpContentToSend,
                nameof(payloadBundle.AsHttpContentToSend)
                );
#pragma warning disable CA1307 // Specify StringComparison for clarity
            _ = Assumption.AssertTrue(
                string.Equals(payload !.AccessToken, this._rollbarLoggerConfig.RollbarDestinationOptions.AccessToken),
                nameof(payload.AccessToken)
                );
#pragma warning restore CA1307 // Specify StringComparison for clarity

            return(true);
        }