Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <inheritdoc />
        public Task <IResponseMessageCacheEntry> GetAsync(Uri requestUri)
        {
            IResponseMessageCacheEntry result = null;

            if (cacheNode.Key == requestUri)
            {
                result = cacheNode.Value;
            }
            return(Task.FromResult(result));
        }
Пример #3
0
        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));
        }
Пример #4
0
        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);
        }
Пример #5
0
        /// <inheritdoc />
        public async Task SetAsync(Uri requestUri, IResponseMessageCacheEntry responseMessageCacheEntry)
        {
            var cacheValue = await ResponseMessageCacheEntry.WrapAsync(responseMessageCacheEntry);

            cacheNode = new KeyValuePair <Uri, ResponseMessageCacheEntry>(requestUri, cacheValue);
        }