async Task <T> Execute <T, T2>(RestRequestWithCache request, Func <IRestResponse <T2>, T> selector, string url = null)
            where T : class, new()
            where T2 : class, new()
        {
            var cacheStyle = request.CacheSyle;
            var restClient = CreateClient(url);

            switch (cacheStyle)
            {
            case RestRequestWithCache.CacheStyle.None:
                break;

            case RestRequestWithCache.CacheStyle.Immutable:
                var item = cache.Get(CacheKey <T>(restClient, request));

                if (item != null)
                {
                    return((T)item);
                }

                break;

            case RestRequestWithCache.CacheStyle.IfNotModified:
                var obj = cache.Get(CacheKey <T>(restClient, request));

                if (obj != null)
                {
                    var tuple = (Tuple <string, T>)obj;
                    request.AddHeader("If-None-Match", tuple.Item1);
                }

                break;
            }

            LogRequest(request);

            var response = await restClient.ExecuteTaskAsync <T2>(request).ConfigureAwait(false);

            CleanResponse(response);

            var data = default(T);

            switch (cacheStyle)
            {
            case RestRequestWithCache.CacheStyle.Immutable:
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    data = ProcessResponse(selector, response);
                    CacheData(request, restClient, data);
                }
                break;

            case RestRequestWithCache.CacheStyle.IfNotModified:
                switch (response.StatusCode)
                {
                case HttpStatusCode.OK:
                    data = ProcessResponse(selector, response);
                    var etag = response.Headers.FirstOrDefault(h => h.Name == "ETag");
                    if (etag != null)
                    {
                        CacheData(request, restClient, Tuple.Create(etag.Value.ToString(), data));
                    }
                    break;

                case HttpStatusCode.NotModified:
                    LogResponse(response);

                    var obj = cache.Get(CacheKey <T>(restClient, request));

                    if (obj != null)
                    {
                        var tuple = (Tuple <string, T>)obj;
                        data = tuple.Item2;
                    }
                    break;
                }
                break;

            default:
                data = ProcessResponse(selector, response);
                break;
            }

            return(data);
        }
Example #2
0
        T Execute <T>(RestRequestWithCache request, Func <IRestResponse, T> selector, string baseUrl = null)
        {
            var cacheStyle = request.CacheSyle;
            var restClient = CreateClient(baseUrl);

            switch (cacheStyle)
            {
            case RestRequestWithCache.CacheStyle.None:
                break;

            case RestRequestWithCache.CacheStyle.Immutable:
                var item = cache.Get(CacheKey <T>(restClient, request));

                if (item != null)
                {
                    return((T)item);
                }

                break;

            case RestRequestWithCache.CacheStyle.IfNotModified:
                var obj = cache.Get(CacheKey <T>(restClient, request));

                if (obj != null)
                {
                    var tuple = (Tuple <string, T>)obj;
                    request.AddHeader("If-None-Match", tuple.Item1);
                }

                break;
            }

            LogRequest(request);

            var response = restClient.Execute(request);

            var data = default(T);

            switch (cacheStyle)
            {
            case RestRequestWithCache.CacheStyle.Immutable:
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    data = ProcessResponse(selector, response);
                    CacheData(request, restClient, data);
                }
                // https://github.com/Particular/FeatureDevelopment/issues/296
                else if (response.StatusCode == HttpStatusCode.NoContent)
                {
                    data = ProcessResponse(selector, response);
                    CacheData(request, restClient, data);
                }

                break;

            case RestRequestWithCache.CacheStyle.IfNotModified:
                switch (response.StatusCode)
                {
                case HttpStatusCode.OK:
                    data = ProcessResponse(selector, response);
                    var etag = response.Headers.FirstOrDefault(h => h.Name == "ETag");
                    if (etag != null)
                    {
                        CacheData(request, restClient, Tuple.Create(etag.Value.ToString(), data));
                    }
                    break;

                case HttpStatusCode.NotModified:
                    LogResponse(response);

                    var obj = cache.Get(CacheKey <T>(restClient, request));

                    if (obj != null)
                    {
                        var tuple = (Tuple <string, T>)obj;
                        data = tuple.Item2;
                    }
                    break;
                }
                break;

            default:
                data = ProcessResponse(selector, response);
                break;
            }

            return(data);
        }