/// <inheritdoc />
        public virtual async Task <string> GetTokenAsync(CancellationToken cancellationToken)
        {
            //get initial access token and refresh token
            if (OidcAuthenticationToken.AccessToken == null)
            {
                BigBrother.Publish(new ClientTokenRequest
                {
                    ClientId  = OidcAuthenticationConfig.ClientId,
                    Authority = OidcAuthenticationConfig.Uri,
                    Message   = "Token is null getting a new one."
                });

                await EnterSemaphore(cancellationToken, async() =>
                {
                    var httpClient = HttpClientFactory.Get(OidcAuthenticationConfig.Uri);
                    var response   = await GetTokenResponseAsync(httpClient, cancellationToken);
                    ReportTokenUpdateFailure(OidcAuthenticationConfig, response);
                    UpdateToken(response);

                    BigBrother.Publish(new ClientTokenRequest
                    {
                        ClientId  = OidcAuthenticationConfig.ClientId,
                        Authority = OidcAuthenticationConfig.Uri,
                        Message   = "Got a new token and updating the http client when token was null"
                    });
                });
            }
            else if (CheckExpired())
            {
                await EnterSemaphore(cancellationToken, async() =>
                {
                    if (CheckExpired())
                    {
                        var httpClient = HttpClientFactory.Get(OidcAuthenticationConfig.Uri);
                        var response   = await GetTokenResponseAsync(httpClient, cancellationToken);
                        ReportTokenUpdateFailure(OidcAuthenticationConfig, response);
                        UpdateToken(response);

                        BigBrother.Publish(new ClientTokenRequest
                        {
                            ClientId  = OidcAuthenticationConfig.ClientId,
                            Authority = OidcAuthenticationConfig.Uri,
                            Message   = "Refreshing token and updating the http client with new token"
                        });
                    }
                });
            }

            return($"Bearer {OidcAuthenticationToken.AccessToken}");
        }
        public async Task <FailableResult <T> > Get <T>(string url)
        {
            var retry = 0;

            while (retry < RETRY_MAX)
            {
                try
                {
                    var client   = _httpClientFactory.Get();
                    var response = await client.GetAsync(url);

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

                    var result = JsonConvert.DeserializeObject <T>(resultStr);

                    return(new FailableResult <T> {
                        Result = result
                    });
                }
                catch (Exception e)
                {
                    if (retry >= RETRY_MAX)
                    {
                        return(new FailableResult <T> {
                            Error = e.Message + e.StackTrace.ToString()
                        });
                    }
                }

                _httpClientFactory.Recycle();
                retry += 1;
            }

            throw new InvalidProgramException();
        }
Exemplo n.º 3
0
        /// <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;
            }
        }
Exemplo n.º 4
0
        public async Task <string> Call(string baseAddress, string relativeAddress)
        {
            var httpClient      = _httpClientFactory.Get(baseAddress);
            var responseMessage = await httpClient.GetAsync(relativeAddress);

            return((await responseMessage.Content.ReadAsStringAsync()).Length > 0 ? baseAddress + " ok" : baseAddress + " fail");
        }
Exemplo n.º 5
0
        /// <inheritdoc />
        public async Task ReceiveMessage(int botId, string senderId, long messageToken, MessageBase message)
        {
            InMessage inMessage = null;

            switch (message.Type)
            {
            case Viber.Bot.Enums.MessageType.Picture:
                inMessage = CreatePictureMessage((PictureMessage)message);
                break;

            case Viber.Bot.Enums.MessageType.Video:
                inMessage = CreateVideoMessage((VideoMessage)message);
                break;

            case Viber.Bot.Enums.MessageType.Text:
                var textMessage = (TextMessage)message;

                if (Enum.TryParse <ButtonType>(textMessage.Text, out var buttonType))
                {
                    if (buttonType == ButtonType.OK)
                    {
                        await Subscribed(botId, senderId);

                        return;
                    }

                    inMessage = CreateButtonMessage(buttonType, messageToken);
                }
                else
                {
                    inMessage = CreateTextMessage(textMessage);
                }
                break;
            }

            //
            var people = await peopleRepository.GetPeopleByViberIdAsync(senderId);

            //
            var model = new PayloadModel <InMessage>
            {
                BotId   = botId,
                AgentId = people.Id,
                Message = inMessage
            };

            var response = httpClientFactory.Get("https://localhost:5001/api/").SendPostAsync <MessageModel <InMessage>, string>("msgbot/change_state", model, "application/xml");
        }
        public async Task <string> Request(string url, CancellationTokenSource token = null)
        {
            _currentToken = token ?? new CancellationTokenSource();

            var httpClient = _httpClientFactory.Get();
            var msg        = await httpClient.GetAsync(url, _currentToken.Token);

            if (!msg.IsSuccessStatusCode)
            {
                return("Something derped");
            }

            var result = await msg.Content.ReadAsStringAsync();

            return(result);
        }
Exemplo n.º 7
0
        public async Task <string> Download(string url, CancellationTokenSource token = null)
        {
            _currentToken = token ?? new CancellationTokenSource();

            var handler      = _httpClientFactory.GetHandler();
            var outerHandler = new RetryHandler(handler, 3);
            var client       = _httpClientFactory.Get(outerHandler);
            var msg          = await client.GetAsync(url, _currentToken.Token);

            if (!msg.IsSuccessStatusCode)
            {
                return("Something derped");
            }

            var result = await msg.Content.ReadAsStringAsync();

            return(result);
        }
Exemplo n.º 8
0
        private HttpClient GetHttpClient()
        {
            var httpClient = _httpClientFactory.Get();

            if (string.IsNullOrWhiteSpace(_config?.AuthConfig?.AuthHeaderConfig?.Secret))
            {
                return(httpClient);
            }

            if (httpClient.DefaultRequestHeaders.Contains(_config.AuthConfig.AuthHeaderConfig.HeaderName))
            {
                return(httpClient);
            }

            httpClient.DefaultRequestHeaders.Add(
                _config.AuthConfig.AuthHeaderConfig.HeaderName,
                _config.AuthConfig.AuthHeaderConfig.Secret);

            return(httpClient);
        }
 public ClientApiService(IHttpClientFactory factory)
 {
     HttpClient = factory.Get();
 }