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); }
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); }