// TODO: refresh the file when it gets old
        public override async Task<Tuple<bool, INuGetResource>> TryCreate(SourceRepository source, CancellationToken token)
        {
            ServiceIndexResourceV3 index = null;

            string url = source.PackageSource.Source;

            // the file type can easily rule out if we need to request the url
            if (url.EndsWith(".json", StringComparison.OrdinalIgnoreCase))
            {
                // check the cache before downloading the file
                if (!_cache.TryGetValue(url, out index))
                {
                    var messageHandlerResource = await source.GetResourceAsync<HttpHandlerResource>(token);

                    DataClient client = new DataClient(messageHandlerResource.MessageHandler);

                    JObject json = await client.GetJObjectAsync(new Uri(url), token);

                    if (json != null)
                    {
                        // Use SemVer instead of NuGetVersion, the service index should always be
                        // in strict SemVer format
                        SemanticVersion version = null;
                        var status = json.Value<string>("version");
                        if (status != null && SemanticVersion.TryParse(status, out version))
                        {
                            if (version.Major == 3)
                            {
                                index = new ServiceIndexResourceV3(json, DateTime.UtcNow);
                            }
                        }
                    }
                }

                // cache the value even if it is null to avoid checking it again later
                _cache.TryAdd(url, index);
            }

            return new Tuple<bool, INuGetResource>(index != null, index);
        }
        // TODO: refresh the file when it gets old
        public override async Task<Tuple<bool, INuGetResource>> TryCreate(SourceRepository source, CancellationToken token)
        {
            ServiceIndexResourceV3 index = null;

            var url = source.PackageSource.Source;

            // the file type can easily rule out if we need to request the url
            if (source.PackageSource.ProtocolVersion == 3 ||
                (source.PackageSource.IsHttp &&
                url.EndsWith(".json", StringComparison.OrdinalIgnoreCase)))
            {
                ServiceIndexCacheInfo cacheInfo;
                // check the cache before downloading the file
                if (!_cache.TryGetValue(url, out cacheInfo) ||
                    UtcNow - cacheInfo.CachedTime > MaxCacheDuration)
                {
                    var messageHandlerResource = await source.GetResourceAsync<HttpHandlerResource>(token);

                    var client = new DataClient(messageHandlerResource.MessageHandler);

                    JObject json;

                    try
                    {
                        json = await client.GetJObjectAsync(new Uri(url), token);
                    }
                    catch (JsonReaderException)
                    {
                        _cache.TryAdd(url, new ServiceIndexCacheInfo { CachedTime = UtcNow });
                        return new Tuple<bool, INuGetResource>(false, null);
                    }
                    catch (HttpRequestException)
                    {
                        _cache.TryAdd(url, new ServiceIndexCacheInfo { CachedTime = UtcNow });
                        return new Tuple<bool, INuGetResource>(false, null);
                    }

                    if (json != null)
                    {
                        // Use SemVer instead of NuGetVersion, the service index should always be
                        // in strict SemVer format
                        SemanticVersion version;
                        JToken versionToken;
                        if (json.TryGetValue("version", out versionToken) &&
                            versionToken.Type == JTokenType.String &&
                            SemanticVersion.TryParse((string)versionToken, out version) &&
                            version.Major == 3)
                        {
                            index = new ServiceIndexResourceV3(json, UtcNow);
                        }
                    }
                }
                else
                {
                    index = cacheInfo.Index;
                }

                // cache the value even if it is null to avoid checking it again later
                _cache.TryAdd(url, new ServiceIndexCacheInfo { CachedTime = UtcNow, Index = index });
            }

            return new Tuple<bool, INuGetResource>(index != null, index);
        }
Example #3
0
        public async Task DataClient_Basic_NoCache()
        {
            int count = 0;
            TestHandler handler = new TestHandler((request) =>
            {
                count++;
                var response = new HttpResponseMessage(HttpStatusCode.OK);
                response.Content = new TestContent(TestJson.BasicGraph);

                return response;
            });

            using (var client = new DataClient(handler))
            {
                var json = await client.GetJObjectAsync(new Uri("http://test/doc"));
                json = await client.GetJObjectAsync(new Uri("http://test/doc"));
                json = await client.GetJObjectAsync(new Uri("http://test/doc"));

                Assert.Equal(3, count);
            }
        }
Example #4
0
        public async Task DataClient_Basic()
        {
            TestHandler handler = new TestHandler((request) =>
                {
                    var response = new HttpResponseMessage(HttpStatusCode.OK);
                    response.Content = new TestContent(TestJson.BasicGraph);

                    return response;
                });

            using (var client = new DataClient(handler))
            {
                var json = await client.GetJObjectAsync(new Uri("http://test/doc"));
                Assert.Equal("test", json["name"].ToString());
            }
        }
Example #5
0
        public async Task DataClient_GetFile_404()
        {
            int count = 0;
            TestHandler handler = new TestHandler((request) =>
            {
                count++;
                var response = new HttpResponseMessage(HttpStatusCode.NotFound);
                response.Content = new TestContent(TestJson.BasicGraph);

                return response;
            });

            RetryHandler retryHandler = new RetryHandler(handler, 2);

            using (var client = new DataClient(retryHandler))
            {
                var json = await client.GetJObjectAsync(new Uri("http://test/doc"));
                Assert.Equal(2, count);
            }
        }