Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion src/HttpClient.Cache/CacheData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,21 @@

public class CacheData
{
public CacheData(byte[] data, HttpResponseMessage response)
public CacheData(
byte[] data,
Dictionary<string, IEnumerable<string>> headers,
Dictionary<string, IEnumerable<string>> contentHeaders,
HttpResponseMessage response)
{
Data = data;
Response = response;
Headers = headers;
ContentHeaders = contentHeaders;
}

public Dictionary<string, IEnumerable<string>> Headers { get; }

public Dictionary<string, IEnumerable<string>> ContentHeaders { get; }

public byte[] Data { get; }

Expand Down
4 changes: 4 additions & 0 deletions src/HttpClient.Cache/HttpClient.Cache.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,8 @@
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>

<ItemGroup>
<InternalsVisibleTo Include="HttpClient.Cache.Tests" />
</ItemGroup>

</Project>
32 changes: 23 additions & 9 deletions src/HttpClient.Cache/Utils/HttpResponseMessageExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,29 +1,43 @@
namespace HttpClient.Cache.Utils;

public static class HttpResponseMessageExtensions
internal static class HttpResponseMessageExtensions
{
public static async Task<CacheData> ToCacheDataAsync(this HttpResponseMessage response)
internal static async Task<CacheData> ToCacheDataAsync(this HttpResponseMessage response)
{
var data = await response.Content.ReadAsByteArrayAsync();
var copy = new HttpResponseMessage
var copiedResponse = new HttpResponseMessage
{
ReasonPhrase = response.ReasonPhrase, StatusCode = response.StatusCode, Version = response.Version
};

var headers = response.Headers
.Where(headers => headers.Value.Any())
.ToDictionary(header => header.Key, header => header.Value);

var contentHeaders = response.Content.Headers
.Where(contentHeader => contentHeader.Value.Any())
.ToDictionary(header => header.Key, header => header.Value);

//TODO: headers are important. Will be added later;

var entry = new CacheData(data, copy);
var entry = new CacheData(data, headers, contentHeaders, copiedResponse);
return entry;
}

public static HttpResponseMessage RestoreResponseFromCache(this HttpRequestMessage request, CacheData cacheData)
internal static HttpResponseMessage RestoreResponseFromCache(this HttpRequestMessage request, CacheData cacheData)
{
var response = cacheData.Response;
response.Content = new ByteArrayContent(cacheData.Data);
response.RequestMessage = request;

//TODO: headers are important. Will be added later;

foreach (var kvp in cacheData.Headers)
{
response.Headers.TryAddWithoutValidation(kvp.Key, kvp.Value);
}

foreach (var kvp in cacheData.ContentHeaders)
{
response.Content.Headers.TryAddWithoutValidation(kvp.Key, kvp.Value);
}

return response;
}
}
8 changes: 6 additions & 2 deletions tests/HttpClient.Cache.Tests/CacheDataExtensionsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ public void Pack_CreateABytesFromCacheData_ReturnByteArray()
var message = Encoding.UTF8.GetBytes("Here is a message");
var response =
new HttpResponseMessage { Content = new ByteArrayContent(message), StatusCode = HttpStatusCode.OK };
var data = new CacheData(message, response);
var headers = new Dictionary<string, IEnumerable<string>> { { "header", new[] { "header-value" } } };
var contentHeaders = new Dictionary<string, IEnumerable<string>> { { "contentHeader", new[] { "contentHeader-value" } } };
var data = new CacheData(message, headers, contentHeaders, response);

var packData = data.Pack();

Expand All @@ -37,7 +39,9 @@ public void UnPack_CreateCacheDataEn_ReturnByteArray()
var message = Encoding.UTF8.GetBytes("Here is a message");
var response =
new HttpResponseMessage { Content = new ByteArrayContent(message), StatusCode = HttpStatusCode.OK };
var cacheData = new CacheData(message, response);
var headers = new Dictionary<string, IEnumerable<string>> { { "header", new[] { "header-value" } } };
var contentHeaders = new Dictionary<string, IEnumerable<string>> { { "contentHeader", new[] { "contentHeader-value" } } };
var cacheData = new CacheData(message, headers, contentHeaders, response);
var serializeObject = JsonConvert.SerializeObject(cacheData);
var bytes = new byte[serializeObject.Length * sizeof(char)];
Buffer.BlockCopy(serializeObject.ToCharArray(), 0, bytes, 0, bytes.Length);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,10 @@ public class MemoryCacheExtensionsTests
public async Task TryGetAsync_GetCacheItemFromMemoryCacheOut_ReturnTrue()
{
const string cacheKey = "key";
var headers = new Dictionary<string, IEnumerable<string>> { { "header", new[] { "header-value" } } };
var contentHeaders = new Dictionary<string, IEnumerable<string>> { { "contentHeader", new[] { "contentHeader-value" } } };
var memoryCache = new MemoryCache(new MemoryCacheOptions());
var cacheData = new CacheData(Encoding.UTF8.GetBytes("message"),
var cacheData = new CacheData(Encoding.UTF8.GetBytes("message"), headers, contentHeaders,
new HttpResponseMessage { StatusCode = HttpStatusCode.OK });

using (var entry = memoryCache.CreateEntry(cacheKey))
Expand All @@ -35,8 +37,10 @@ public async Task TryGetAsync_GetCacheItemFromMemoryCacheOut_ReturnTrue()
public async Task TrySetAsync_SetCacheDataByKeyAndExpRelativeToNow_ReturnTrue()
{
const string cacheKey = "key";
var headers = new Dictionary<string, IEnumerable<string>> { { "header", new[] { "header-value" } } };
var contentHeaders = new Dictionary<string, IEnumerable<string>> { { "contentHeader", new[] { "contentHeader-value" } } };
var memoryCache = new MemoryCache(new MemoryCacheOptions());
var cacheData = new CacheData(Encoding.UTF8.GetBytes("message"),
var cacheData = new CacheData(Encoding.UTF8.GetBytes("message"), headers, contentHeaders,
new HttpResponseMessage { StatusCode = HttpStatusCode.OK });
var absoluteTimeoutRelativeToNow = TimeSpan.FromDays(1);

Expand All @@ -49,8 +53,10 @@ public async Task TrySetAsync_SetCacheDataByKeyAndExpRelativeToNow_ReturnTrue()
public async Task TrySetAsync_SetCacheDataByKeyAndAbsoluteExp_ReturnTrue()
{
const string cacheKey = "key";
var headers = new Dictionary<string, IEnumerable<string>> { { "header", new[] { "header-value" } } };
var contentHeaders = new Dictionary<string, IEnumerable<string>> { { "contentHeader", new[] { "contentHeader-value" } } };
var memoryCache = new MemoryCache(new MemoryCacheOptions());
var cacheData = new CacheData(Encoding.UTF8.GetBytes("message"),
var cacheData = new CacheData(Encoding.UTF8.GetBytes("message"), headers, contentHeaders,
new HttpResponseMessage { StatusCode = HttpStatusCode.OK });
var absoluteExpiration = DateTimeOffset.UtcNow.AddDays(1);

Expand All @@ -63,8 +69,10 @@ public async Task TrySetAsync_SetCacheDataByKeyAndAbsoluteExp_ReturnTrue()
public async Task TrySetAsync_SetCacheDataByKeySlidingWindow_ReturnTrue()
{
const string cacheKey = "key";
var headers = new Dictionary<string, IEnumerable<string>> { { "header", new[] { "header-value" } } };
var contentHeaders = new Dictionary<string, IEnumerable<string>> { { "contentHeader", new[] { "contentHeader-value" } } };
var memoryCache = new MemoryCache(new MemoryCacheOptions());
var cacheData = new CacheData(Encoding.UTF8.GetBytes("message"),
var cacheData = new CacheData(Encoding.UTF8.GetBytes("message"), headers, contentHeaders,
new HttpResponseMessage { StatusCode = HttpStatusCode.OK });
var slidingExpiration = TimeSpan.FromDays(1);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,9 @@ public void RestoreResponseFromCache_RestoreHttpResponse_ReturnHttpResponseMessa
StatusCode = HttpStatusCode.Found,
Version = Version.Parse("1.0")
};
var cacheData = new CacheData(content, cachedResponse);
var headers = new Dictionary<string, IEnumerable<string>> { { "header", new[] { "header-value" } } };
var contentHeaders = new Dictionary<string, IEnumerable<string>> { { "contentHeader", new[] { "contentHeader-value" } } };
var cacheData = new CacheData(content, headers, contentHeaders, cachedResponse);
var newRequest = new HttpRequestMessage { Method = HttpMethod.Get };

var restoredResponse = newRequest.RestoreResponseFromCache(cacheData);
Expand Down