/// <summary> /// Wraps a <see cref="IResponseMessageCacheEntry"/> object as a <see cref="ResponseMessageCacheEntry"/>. /// </summary> public static async Task <ResponseMessageCacheEntry> WrapAsync(IResponseMessageCacheEntry entry) { var result = entry as ResponseMessageCacheEntry; if (result == null) { result = await CreateAsync(entry.ETag, entry.LastModified, entry.ToResponseMessage()); } return(result); }
/// <inheritdoc /> public Task <IResponseMessageCacheEntry> GetAsync(Uri requestUri) { IResponseMessageCacheEntry result = null; if (cacheNode.Key == requestUri) { result = cacheNode.Value; } return(Task.FromResult(result)); }
private async Task <IPageCollection <T> > GetPageCollectionAsync <T>(Uri uri, string accessToken, CancellationToken cancellationToken) { IResponseMessageCacheEntry responseMessageCacheEntry = null; if (responseMessageCache != null) { responseMessageCacheEntry = await responseMessageCache.GetAsync(uri); } await rateLimiter.WaitIfNecessaryAsync(); string responseJson; Uri nextUri; using (var requestMessage = CreateRequest(HttpMethod.Get, uri, accessToken: accessToken, responseMessageCacheEntry: responseMessageCacheEntry)) using (var httpClient = httpClientPool.Create()) using (var responseMessage = await httpClient.SendAsync(requestMessage, cancellationToken)) { var localResponseMessage = responseMessage; if (responseMessage.StatusCode == System.Net.HttpStatusCode.NotModified && responseMessageCacheEntry != null) { localResponseMessage = responseMessageCacheEntry.ToResponseMessage(); } else { await HttpResponseUtils.EnsureSuccessAsync(responseMessage); } responseJson = await localResponseMessage.Content.ReadAsStringAsync(); nextUri = HttpResponseUtils.ParseNextUriOrNull(localResponseMessage); if (responseMessageCacheEntry == null) { await CacheResponseMessageAsync(uri, localResponseMessage, responseJson); } } var elements = JsonConvert.DeserializeObject <IReadOnlyCollection <T> >(responseJson); return(new PageCollection <T>(elements, nextUri, this)); }
private HttpRequestMessage CreateRequest(HttpMethod method, Uri requestUri, string accessToken, IResponseMessageCacheEntry responseMessageCacheEntry) { var requestMessage = new HttpRequestMessage(method, requestUri); requestMessage.Headers.UserAgent.TryParseAdd(userAgent); if (accessToken != null) { requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); } if (responseMessageCache != null) { if (!string.IsNullOrWhiteSpace(responseMessageCacheEntry.ETag)) { requestMessage.Headers.IfNoneMatch.TryParseAdd(responseMessageCacheEntry.ETag); } if (responseMessageCacheEntry.LastModified.HasValue) { requestMessage.Headers.IfModifiedSince = responseMessageCacheEntry.LastModified; } } return(requestMessage); }
/// <inheritdoc /> public async Task SetAsync(Uri requestUri, IResponseMessageCacheEntry responseMessageCacheEntry) { var cacheValue = await ResponseMessageCacheEntry.WrapAsync(responseMessageCacheEntry); cacheNode = new KeyValuePair <Uri, ResponseMessageCacheEntry>(requestUri, cacheValue); }