/// <summary> /// /// </summary> /// <typeparam name="TRequest"></typeparam> /// <param name="request"></param> /// <param name="metadata"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public virtual async Task CallAsync <TRequest>(TRequest request, IDictionary <string, object> metadata, CancellationToken cancellationToken) { try { if (!(request is MessageData messageData)) { throw new Exception("injected wrong implementation"); } //todo refactor into a single call and a dto var uri = RequestBuilder.BuildUri(WebhookConfig, messageData.Payload); var httpMethod = RequestBuilder.SelectHttpMethod(WebhookConfig, messageData.Payload); var originalPayload = RequestBuilder.BuildPayload(WebhookConfig, messageData.Payload, metadata); var payload = WebhookConfig.PayloadTransformation == PayloadContractTypeEnum.WrapperContract ? WrapPayload(originalPayload, WebhookConfig, messageData) : originalPayload; var config = RequestBuilder.SelectWebhookConfig(WebhookConfig, messageData.Payload); var headers = RequestBuilder.GetHttpHeaders(WebhookConfig, messageData); var authenticationConfig = RequestBuilder.GetAuthenticationConfig(WebhookConfig, messageData.Payload); var httpClient = HttpClientFactory.Get(config); await AddAuthenticationHeaderAsync(cancellationToken, authenticationConfig, headers); var response = await httpClient.SendRequestReliablyAsync(httpMethod, uri, headers, payload, cancellationToken); await _requestLogger.LogAsync(httpClient, response, messageData, uri, httpMethod, headers); } catch (Exception e) { BigBrother.Publish(e.ToExceptionEvent()); throw; } }
/// <summary> /// /// </summary> /// <typeparam name="TRequest"></typeparam> /// <param name="request"></param> /// <param name="metadata"></param> /// <returns></returns> public virtual async Task Call <TRequest>(TRequest request, IDictionary <string, object> metadata = null) { try { if (!(request is MessageData messageData)) { throw new Exception("injected wrong implementation"); } //make a call to client identity provider if (WebhookConfig.AuthenticationConfig.Type != AuthenticationType.None) { await AcquireTokenHandler.GetToken(_client); } var uri = RequestBuilder.BuildUri(WebhookConfig, messageData.Payload); var httpVerb = RequestBuilder.SelectHttpVerb(WebhookConfig, messageData.Payload); var payload = this.RequestBuilder.BuildPayload(this.WebhookConfig, messageData.Payload, metadata); void TelemetryEvent(string msg) { BigBrother.Publish(new HttpClientFailure(messageData.Handle, messageData.Type, payload, msg)); } var response = await _client.ExecuteAsJsonReliably(httpVerb, uri, payload, TelemetryEvent); BigBrother.Publish(new WebhookEvent(messageData.Handle, messageData.Type, $"Response status code {response.StatusCode}")); } catch (Exception e) { BigBrother.Publish(e.ToExceptionEvent()); throw; } }