Ejemplo n.º 1
0
        /// <summary>
        /// Gibt einen <see cref="HttpClient"/> fertig konfiguriert für API-Abfragen zurück.
        /// </summary>
        /// <returns></returns>
        private async Task <HttpClient> GetHttpClientAsync()
        {
            // Token aus dem DataStore laden.
            Token token = await _client.Options.DataStore.GetAsync(_client.Options.Credentials.GetCredentials().Key);

            // Prüfen ob ein Token aus dem DataStore geladen werden konnte. Wenn ja muss geprüft
            // werden ob dieser noch gültig ist. Wenn das Token gültig ist, wird es zurückgegeben.
            // Falls es nicht gültig ist, wird versucht ein neues anzufordern.
            if (token != null)
            {
                try
                {
                    string   payload  = Jose.JWT.Payload(_client.Context.AccessToken.AccessToken);
                    JwtToken jwtToken = await Task.Run(() => JsonConvert.DeserializeObject <JwtToken>(payload));

                    DateTimeOffset date = DateTimeOffset.FromUnixTimeSeconds(jwtToken.ExpirationTime);

                    if (date.UtcDateTime < DateTime.UtcNow)
                    {
                        token = null;
                    }
                }
                catch
                {
                    if (token.Issued.Value.AddSeconds(token.ExpiresIn) < DateTime.Now)
                    {
                        token = null;
                    }
                }
            }

            // Falls kein Token vorhanden, neues anfordern.
            if (token == null)
            {
                await _client.ConnectAsync();

                if (_client.IsValidated)
                {
                    token = _client.Context.AccessToken;
                }
                else
                {
                    return(await Task.FromResult <HttpClient>(null));
                }
            }

            if (_httpClient != null)
            {
                _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.AccessToken);
                return(_httpClient);
            }
            else
            {
                var handler = new HttpClientHandler
                {
                    AutomaticDecompression = DecompressionMethods.GZip
                };

                _httpClient = new HttpClient(handler);
                _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.AccessToken);
                _httpClient.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));

                return(_httpClient);
            }
        }