async Task <JToken> CallInternalAsync(FormUrlEncodedContent content, int attemptNumber) { CancellationToken.ThrowIfCancellationRequested(); await EnsureApiClientAsync(); try { var response = await apiClient.PostAsync("/api/1", content, CancellationToken); if (!response.IsSuccessStatusCode) { throw new HttpRequestException("invalid HTTP request"); } var stream = await response.Content.ReadAsStreamAsync(); var json = (JObject)JToken.ReadFrom(new JsonTextReader(new StreamReader(stream))); if (json ["status"].Value <string> () != "ok") { Console.Error.WriteLine(json); throw new HttpRequestException("JSON result is not status==ok"); } return(json ["result"]); } catch (Exception e) when(!(e is HttpRequestException)) { apiClient = null; tokenEndpointResponse = null; if (attemptNumber >= MaxRetryAttempts) { throw; } return(await CallInternalAsync(content, attemptNumber ++)); } }
async Task RefreshAccessTokenAsync() { var client = CreateHttp(); client.DefaultRequestHeaders.Authorization = clientCredentials.ToHttpBasicAuthentication(); var response = await client.PostAsync( "/oauth2/token", CreateHttpContent ("grant_type", "client_credentials") ); tokenEndpointResponse = await response.Content.ReadAsJsonAsync <TokenEndpointResponse> (); if (tokenEndpointResponse?.ErrorCode != null) { throw new TokenEndpointException(tokenEndpointResponse); } if (!response.IsSuccessStatusCode) { throw new HttpRequestException("invalid HTTP request with no TokenEndpointResponse"); } }
public TokenEndpointException(TokenEndpointResponse response) : base(String.Format ("HTTP request error: {0} ({1})", response.ErrorCode, response.ErrorDescription)) { Response = response; }
public TokenEndpointException(TokenEndpointResponse response) : base(String.Format("HTTP request error: {0} ({1})", response.ErrorCode, response.ErrorDescription)) { Response = response; }