/// <summary>
        /// Entry point for a generic http request which reports on the request and tries with exponential back-off for transient failure.
        /// </summary>
        /// <param name="client"></param>
        /// <param name="httpMethod"></param>
        /// <param name="uri"></param>
        /// <param name="webHookHeaders"></param>
        /// <param name="payload"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        public static async Task <HttpResponseMessage> SendRequestReliablyAsync(
            this HttpClient client,
            HttpMethod httpMethod,
            Uri uri,
            WebHookHeaders webHookHeaders,
            string payload,
            CancellationToken token = default)
        {
            var result = await RetryRequest(() =>
            {
                var request = new HttpRequestMessage(httpMethod, uri);

                if (httpMethod != HttpMethod.Get)
                {
                    request.Content = new StringContent(payload, Encoding.UTF8, webHookHeaders.ContentHeaders[Constants.Headers.ContentType]);
                }

                foreach (var key in webHookHeaders.RequestHeaders.Keys)
                {
                    //todo is this the correct thing to do when there is a CorrelationVector with multiple Children.
                    if (request.Headers.Contains(key))
                    {
                        request.Headers.Remove(key);
                    }

                    request.Headers.Add(key, webHookHeaders.RequestHeaders[key]);
                }

                return(client.SendAsync(request, token));
            });

            return(result);
        }
Example #2
0
        /// <inheritdoc />
        public WebHookHeaders GetHttpHeaders(WebhookConfig webhookConfig, MessageData messageData)
        {
            if (webhookConfig == null)
            {
                throw new ArgumentNullException(nameof(webhookConfig));
            }
            if (messageData == null)
            {
                throw new ArgumentNullException(nameof(messageData));
            }

            var headers = new WebHookHeaders();

            headers.AddContentHeader(Constants.Headers.ContentType, webhookConfig.ContentType);
            headers.AddRequestHeader(Constants.Headers.CorrelationId, messageData.CorrelationId);
            headers.AddRequestHeader(Constants.Headers.EventDeliveryId, messageData.CorrelationId);
            headers.AddRequestHeader(Constants.Headers.EventType, webhookConfig.EventType);

            return(headers);
        }
Example #3
0
        public async Task LogAsync(
            HttpClient httpClient,
            HttpResponseMessage response,
            MessageData messageData,
            Uri uri,
            HttpMethod httpMethod,
            WebHookHeaders headers
            )
        {
            _bigBrother.Publish(new WebhookEvent(
                                    messageData.EventHandlerActorId,
                                    messageData.Type,
                                    $"Response status code {response.StatusCode}",
                                    uri.AbsoluteUri,
                                    httpMethod,
                                    response.StatusCode,
                                    messageData.CorrelationId));

            //only log the failed requests in more depth, need to have a good think about this - debugging v privacy
            if (response.IsSuccessStatusCode)
            {
                return;
            }

            _bigBrother.Publish(new FailedWebHookEvent(
                                    httpClient.DefaultRequestHeaders.ToString(),
                                    response.Headers.ToString(),
                                    messageData.Payload ?? string.Empty,
                                    await GetPayloadAsync(response),
                                    messageData.EventHandlerActorId,
                                    messageData.Type,
                                    $"Response status code {response.StatusCode}",
                                    uri.AbsoluteUri,
                                    httpMethod,
                                    response.StatusCode,
                                    messageData.CorrelationId)
            {
                AuthToken = response.StatusCode == System.Net.HttpStatusCode.Unauthorized? headers?.RequestHeaders?[Constants.Headers.Authorization]: string.Empty
            });
        }
        protected async Task AddAuthenticationHeaderAsync(CancellationToken cancellationToken, WebhookConfig config, WebHookHeaders webHookHeaders)
        {
            if (config.AuthenticationConfig.Type != AuthenticationType.None)
            {
                var acquireTokenHandler = await _authenticationHandlerFactory.GetAsync(config, cancellationToken);

                var result = await acquireTokenHandler.GetTokenAsync(cancellationToken);

                webHookHeaders.AddRequestHeader(Constants.Headers.Authorization, result);
            }
        }