/// <summary> /// Makes a request to the Fitbit API. /// </summary> /// <param name="request">An <see cref="IFitbitRequest"/>.</param> /// <returns>An <see cref="FitbitResponse"/>.</returns> /// <exception cref="InvalidOperationException">Thrown when the <see cref="IFitbitRequest"/> /// does not contain the required properties.</exception> private FitbitResponse MakeRequest(IFitbitRequest request) { var accessToken = string.Empty; if (this.user != null) { accessToken = this.user.TryGetClaimValue(FitbitClient.AccessTokenClaimType); } using (var client = new HttpClient()) { client.BaseAddress = new Uri(this.apiBaseAddress); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); foreach (var header in request.GetHeaders()) { client.DefaultRequestHeaders.TryAddWithoutValidation(header.Name, header.Value); } HttpResponseMessage result; if (request.Action == FitbitRequestAction.Get) { result = client.GetAsync(request.GetUri()).Result; } else if (request.Action == FitbitRequestAction.Post) { result = client.PostAsync(request.GetUri(), null).Result; } else if (request.Action == FitbitRequestAction.Delete) { result = client.DeleteAsync(request.GetUri()).Result; } else { throw new ArgumentOutOfRangeException("request.Action"); } var response = new FitbitResponse(result.StatusCode, result.Content.ReadAsStringAsync().Result); // The access token probably needs refreshing. If this is // the first attempt then try the refresh token. if (result.StatusCode == HttpStatusCode.Unauthorized) { if (!request.SupressTokenRefresh) { // Only try to get a refresh token once... request.SupressTokenRefresh = true; if (this.TryRefreshAccessToken(out response)) { return(this.MakeRequest(request)); } } } return(response); } }