diff --git a/src/Ocelot/Cache/AspMemoryCache.cs b/src/Ocelot/Cache/AspMemoryCache.cs index 0bd1fe34..6a28dbbf 100644 --- a/src/Ocelot/Cache/AspMemoryCache.cs +++ b/src/Ocelot/Cache/AspMemoryCache.cs @@ -1,11 +1,9 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Microsoft.Extensions.Caching.Distributed; -using Microsoft.Extensions.Caching.Memory; - -namespace Ocelot.Cache +namespace Ocelot.Cache { + using System; + using System.Collections.Generic; + using Microsoft.Extensions.Caching.Memory; + public class AspMemoryCache : IOcelotCache { private readonly IMemoryCache _memoryCache; @@ -20,7 +18,9 @@ namespace Ocelot.Cache public void Add(string key, T value, TimeSpan ttl, string region) { if (ttl.TotalMilliseconds <= 0) + { return; + } _memoryCache.Set(key, value, ttl); @@ -28,10 +28,13 @@ namespace Ocelot.Cache } public T Get(string key, string region) - { - _memoryCache.TryGetValue(key, out T value); + { + if (_memoryCache.TryGetValue(key, out T value)) + { + return value; + } - return value; + return default(T); } public void ClearRegion(string region) @@ -48,8 +51,10 @@ namespace Ocelot.Cache public void AddAndDelete(string key, T value, TimeSpan ttl, string region) { - if (_memoryCache.TryGetValue(key, out object oldValue)) + if (_memoryCache.TryGetValue(key, out T oldValue)) + { _memoryCache.Remove(key); + } Add(key, value, ttl, region); } diff --git a/src/Ocelot/Cache/InMemoryCache.cs b/src/Ocelot/Cache/InMemoryCache.cs deleted file mode 100644 index c0c892ad..00000000 --- a/src/Ocelot/Cache/InMemoryCache.cs +++ /dev/null @@ -1,81 +0,0 @@ -namespace Ocelot.Cache -{ - using System; - using System.Collections.Generic; - - public class InMemoryCache : IOcelotCache - { - private readonly Dictionary> _cache; - private readonly Dictionary> _regions; - - public InMemoryCache() - { - _cache = new Dictionary>(); - _regions = new Dictionary>(); - } - - public void Add(string key, T value, TimeSpan ttl, string region) - { - if (ttl.TotalMilliseconds <= 0) - { - return; - } - - var expires = DateTime.UtcNow.Add(ttl); - - _cache.Add(key, new CacheObject(value, expires)); - - if (_regions.ContainsKey(region)) - { - var current = _regions[region]; - if (!current.Contains(key)) - { - current.Add(key); - } - } - else - { - _regions.Add(region, new List { key }); - } - } - - public void AddAndDelete(string key, T value, TimeSpan ttl, string region) - { - if (_cache.ContainsKey(key)) - { - _cache.Remove(key); - } - - Add(key, value, ttl, region); - } - - public void ClearRegion(string region) - { - if (_regions.ContainsKey(region)) - { - var keys = _regions[region]; - foreach (var key in keys) - { - _cache.Remove(key); - } - } - } - - public T Get(string key, string region) - { - if (_cache.ContainsKey(key)) - { - var cached = _cache[key]; - - if (cached.Expires > DateTime.UtcNow) - { - return cached.Value; - } - - _cache.Remove(key); - } - - return default(T); - } - } -} diff --git a/src/Ocelot/Cache/Middleware/OutputCacheMiddleware.cs b/src/Ocelot/Cache/Middleware/OutputCacheMiddleware.cs index 3d37febc..615332eb 100644 --- a/src/Ocelot/Cache/Middleware/OutputCacheMiddleware.cs +++ b/src/Ocelot/Cache/Middleware/OutputCacheMiddleware.cs @@ -77,20 +77,6 @@ context.DownstreamResponse = response; } - private string GenerateRequestCacheKey(DownstreamContext context) - { - string hashedContent = null; - StringBuilder downStreamUrlKeyBuilder = new StringBuilder($"{context.DownstreamRequest.Method}-{context.DownstreamRequest.OriginalString}"); - if (context.DownstreamRequest.Content != null) - { - string requestContentString = Task.Run(async () => await context.DownstreamRequest.Content?.ReadAsStringAsync()).Result; - downStreamUrlKeyBuilder.Append(requestContentString); - } - - hashedContent = MD5Helper.GenerateMd5(downStreamUrlKeyBuilder.ToString()); - return hashedContent; - } - internal DownstreamResponse CreateHttpResponseMessage(CachedResponse cached) { if (cached == null) diff --git a/src/Ocelot/DependencyInjection/OcelotBuilder.cs b/src/Ocelot/DependencyInjection/OcelotBuilder.cs index 517d1441..131fff8f 100644 --- a/src/Ocelot/DependencyInjection/OcelotBuilder.cs +++ b/src/Ocelot/DependencyInjection/OcelotBuilder.cs @@ -1,7 +1,3 @@ -using Ocelot.ServiceDiscovery.Providers; - -using Ocelot.Configuration.ChangeTracking; - namespace Ocelot.DependencyInjection { using Microsoft.AspNetCore.Http; @@ -13,6 +9,8 @@ namespace Ocelot.DependencyInjection using Ocelot.Cache; using Ocelot.Claims; using Ocelot.Configuration; + using Ocelot.ServiceDiscovery.Providers; + using Ocelot.Configuration.ChangeTracking; using Ocelot.Configuration.Creator; using Ocelot.Configuration.File; using Ocelot.Configuration.Parser; @@ -58,12 +56,8 @@ namespace Ocelot.DependencyInjection Services = services; Services.Configure(configurationRoot); - //Services.TryAddSingleton, InMemoryCache>(); - //Services.TryAddSingleton, InMemoryCache>(); Services.TryAddSingleton, AspMemoryCache>(); Services.TryAddSingleton, AspMemoryCache>(); - - Services.TryAddSingleton(); Services.TryAddSingleton(); Services.TryAddSingleton(); diff --git a/test/Ocelot.UnitTests/Cache/AspMemoryCacheTests.cs b/test/Ocelot.UnitTests/Cache/AspMemoryCacheTests.cs index 3019f8bf..ae9e1163 100644 --- a/test/Ocelot.UnitTests/Cache/AspMemoryCacheTests.cs +++ b/test/Ocelot.UnitTests/Cache/AspMemoryCacheTests.cs @@ -1,12 +1,11 @@ -using Microsoft.Extensions.Caching.Memory; - -namespace Ocelot.UnitTests.Cache +namespace Ocelot.UnitTests.Cache { using Ocelot.Cache; using Shouldly; using System; using System.Threading; using Xunit; + using Microsoft.Extensions.Caching.Memory; public class AspMemoryCacheTests { @@ -27,6 +26,13 @@ namespace Ocelot.UnitTests.Cache fake.Value.ShouldBe(1); } + [Fact] + public void doesnt_exist() + { + var result = _cache.Get("1", "region"); + result.ShouldBeNull(); + } + [Fact] public void should_add_and_delete() { @@ -42,11 +48,15 @@ namespace Ocelot.UnitTests.Cache [Fact] public void should_clear_region() { - var fake = new Fake(1); - _cache.Add("1", fake, TimeSpan.FromSeconds(100), "region"); + var fake1 = new Fake(1); + var fake2 = new Fake(2); + _cache.Add("1", fake1, TimeSpan.FromSeconds(100), "region"); + _cache.Add("2", fake2, TimeSpan.FromSeconds(100), "region"); _cache.ClearRegion("region"); - var result = _cache.Get("1", "region"); - result.ShouldBeNull(); + var result1 = _cache.Get("1", "region"); + result1.ShouldBeNull(); + var result2 = _cache.Get("2", "region"); + result2.ShouldBeNull(); } [Fact] diff --git a/test/Ocelot.UnitTests/Cache/InMemoryCacheTests.cs b/test/Ocelot.UnitTests/Cache/InMemoryCacheTests.cs deleted file mode 100644 index b9f5b7c0..00000000 --- a/test/Ocelot.UnitTests/Cache/InMemoryCacheTests.cs +++ /dev/null @@ -1,81 +0,0 @@ -namespace Ocelot.UnitTests.Cache -{ - using Ocelot.Cache; - using Shouldly; - using System; - using System.Threading; - using Xunit; - - public class InMemoryCacheTests - { - private readonly InMemoryCache _cache; - - public InMemoryCacheTests() - { - _cache = new InMemoryCache(); - } - - [Fact] - public void should_cache() - { - var fake = new Fake(1); - _cache.Add("1", fake, TimeSpan.FromSeconds(100), "region"); - var result = _cache.Get("1", "region"); - result.ShouldBe(fake); - fake.Value.ShouldBe(1); - } - - [Fact] - public void should_add_and_delete() - { - var fake = new Fake(1); - _cache.Add("1", fake, TimeSpan.FromSeconds(100), "region"); - var newFake = new Fake(1); - _cache.AddAndDelete("1", newFake, TimeSpan.FromSeconds(100), "region"); - var result = _cache.Get("1", "region"); - result.ShouldBe(newFake); - newFake.Value.ShouldBe(1); - } - - [Fact] - public void should_clear_region() - { - var fake = new Fake(1); - _cache.Add("1", fake, TimeSpan.FromSeconds(100), "region"); - _cache.ClearRegion("region"); - var result = _cache.Get("1", "region"); - result.ShouldBeNull(); - } - - [Fact] - public void should_clear_key_if_ttl_expired() - { - var fake = new Fake(1); - _cache.Add("1", fake, TimeSpan.FromMilliseconds(50), "region"); - Thread.Sleep(200); - var result = _cache.Get("1", "region"); - result.ShouldBeNull(); - } - - [Theory] - [InlineData(0)] - [InlineData(-1)] - public void should_not_add_to_cache_if_timespan_empty(int ttl) - { - var fake = new Fake(1); - _cache.Add("1", fake, TimeSpan.FromSeconds(ttl), "region"); - var result = _cache.Get("1", "region"); - result.ShouldBeNull(); - } - - private class Fake - { - public Fake(int value) - { - Value = value; - } - - public int Value { get; } - } - } -} diff --git a/test/Ocelot.UnitTests/CacheManager/OcelotCacheManagerCache.cs b/test/Ocelot.UnitTests/CacheManager/OcelotCacheManagerCache.cs index 26432b32..08ec42a8 100644 --- a/test/Ocelot.UnitTests/CacheManager/OcelotCacheManagerCache.cs +++ b/test/Ocelot.UnitTests/CacheManager/OcelotCacheManagerCache.cs @@ -3,8 +3,8 @@ using global::CacheManager.Core; using Moq; using Ocelot.Cache.CacheManager; - using Shouldly; using System; + using Shouldly; using TestStack.BDDfy; using Xunit;