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); }
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); } }
/// <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); }
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); }
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; }
public static WebhookFeedEntry CreateErrorEntry(WebhookWorkItem webHookWorkItem, WebhookSendResponse response) { return(CreateFeedEntry(WebhookFeedEntryType.Error, webHookWorkItem.EventId, response, webHookWorkItem.WebHook)); }
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); }