Exemple #1
0
 protected virtual Task HandleResponseAsync(WebhookWorkItem webHookWorkItem, WebhookSendResponse webHookSendResponse)
 {
     if (webHookSendResponse.IsSuccessfull)
     {
         return(HandleSuccessAsync(webHookWorkItem, webHookSendResponse));
     }
     else
     {
         return(HandleErrorAsync(webHookWorkItem, webHookSendResponse));
     }
 }
        protected virtual async Task <WebhookSendResponse> NotifyWebHook(string eventId, string eventObject, Webhook webHook, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            WebhookSendResponse response = null;

            var webHookWorkItem = new WebhookWorkItem()
            {
                EventId = eventId,
                WebHook = webHook,
            };

            webHook.RequestParams = new WebhookHttpParams()
            {
                Body = eventObject,
            };

            response = await _webHookSender.SendWebHookAsync(webHookWorkItem);

            return(response);
        }
Exemple #3
0
        private async Task <WebhookSendResponse> PerformSend(WebhookWorkItem webHookWorkItem)
        {
            var result = new WebhookSendResponse();

            try
            {
                var request    = CreateWebHookRequest(webHookWorkItem);
                var httpClient = _httpClientFactory.CreateClient("webhooks");

                var response = await httpClient.SendAsync(request);

                var responseContent = await response.Content.ReadAsStringAsync();

                result = CreateSendResponse(response, responseContent);

                if (!response.IsSuccessStatusCode)
                {
                    throw new WebHookSendException(responseContent, webHookWorkItem.WebHook.Id, webHookWorkItem.EventId);
                }

                return(result);
            }
            catch (WebHookSendException ex)
            {
                result.Error = GetErrorText(webHookWorkItem.FeedEntry?.AttemptCount + 1 ?? 0, ex.Message);
                throw;
            }
            catch (Exception ex)
            {
                result.Error = ex.Message;
                return(result);
            }
            finally
            {
                await HandleResponseAsync(webHookWorkItem, result);
            }
        }
Exemple #4
0
        /// <summary>
        /// Creates <see cref="WebhookFeedEntry"/> from <see cref="webHookWorkItem"/>. If it already has <see cref="WebhookFeedEntry"/>, inreases AttemptCount.
        /// </summary>
        /// <param name="webHookWorkItem"></param>
        /// <param name="webHookSendResponse"></param>
        /// <returns></returns>
        protected virtual WebhookFeedEntry GetOrCreateFeedEntry(WebhookWorkItem webHookWorkItem, WebhookSendResponse webHookSendResponse)
        {
            var feedEntry = webHookWorkItem.FeedEntry;

            if (feedEntry == null)
            {
                feedEntry = WebHookFeedUtils.CreateErrorEntry(webHookWorkItem, webHookSendResponse);
            }
            else
            {
                feedEntry.AttemptCount++;
            }

            return(feedEntry);
        }
Exemple #5
0
        protected virtual async Task HandleErrorAsync(WebhookWorkItem webHookWorkItem, WebhookSendResponse webHookSendResponse)
        {
            var feedEntry = GetOrCreateFeedEntry(webHookWorkItem, webHookSendResponse);

            feedEntry.RecordType = (int)WebhookFeedEntryType.Error;
            feedEntry.Status     = webHookSendResponse?.StatusCode ?? webHookWorkItem.FeedEntry.Status;

            await _logger.LogAsync(feedEntry);

            webHookWorkItem.FeedEntry = feedEntry;

            //delete old FeedEntries except latest by 'LatestErrorCount'
            var errorFeedEntryIds = await _webHookFeedService.GetAllErrorEntriesExceptLatestAsync(new[] { webHookWorkItem.WebHook.Id }, LatestErrorCount);

            await _webHookFeedService.DeleteByIdsAsync(errorFeedEntryIds);
        }
Exemple #6
0
        protected virtual async Task HandleSuccessAsync(WebhookWorkItem webHookWorkItem, WebhookSendResponse webHookSendResponse)
        {
            // Clear error records on this sending after success
            if (webHookWorkItem.FeedEntry?.RecordType == (int)WebhookFeedEntryType.Error && !webHookWorkItem.FeedEntry.IsTransient())
            {
                await _webHookFeedService.DeleteByIdsAsync(new[] { webHookWorkItem.FeedEntry.Id });
            }

            // Create new record (not using and updating existing one!) for proper logging, as all Success entries are accumulated in one record in our current logging policy.
            var feedEntry = WebHookFeedUtils.CreateSuccessEntry(webHookWorkItem, webHookSendResponse);

            await _logger.LogAsync(feedEntry);

            webHookWorkItem.FeedEntry = feedEntry;
        }
Exemple #7
0
 public static WebhookFeedEntry CreateErrorEntry(WebhookWorkItem webHookWorkItem, WebhookSendResponse response)
 {
     return(CreateFeedEntry(WebhookFeedEntryType.Error, webHookWorkItem.EventId, response, webHookWorkItem.WebHook));
 }
Exemple #8
0
        public static WebhookFeedEntry CreateFeedEntry(WebhookFeedEntryType entryType, string eventId, WebhookSendResponse response, Webhook webHook)
        {
            var result = new WebhookFeedEntry()
            {
                RecordType      = (int)entryType,
                WebHookId       = webHook.Id,
                EventId         = eventId,
                AttemptCount    = 0,
                Error           = new string(response.Error.Take(1024).ToArray()),
                Status          = response?.StatusCode ?? 0,
                RequestHeaders  = GetJsonString(webHook.RequestParams.Headers),
                RequestBody     = webHook.RequestParams.Body,
                ResponseHeaders = GetJsonString(response?.ResponseParams?.Headers),
                ResponseBody    = response?.ResponseParams?.Body,
            };

            return(result);
        }