internal static long EstimateCachedResponseSize(OutputCacheEntry cachedResponse) { if (cachedResponse == null) { return(0L); } checked { // StatusCode long size = sizeof(int); // Headers if (cachedResponse.Headers != null) { foreach (var item in cachedResponse.Headers) { size += (item.Key.Length * sizeof(char)) + EstimateStringValuesSize(item.Value); } } // Body if (cachedResponse.Body != null) { size += cachedResponse.Body.Length; } return(size); } }
public static async ValueTask StoreAsync(string key, OutputCacheEntry value, TimeSpan duration, IOutputCacheStore store, CancellationToken cancellationToken) { ArgumentNullException.ThrowIfNull(value); ArgumentNullException.ThrowIfNull(value.Body); ArgumentNullException.ThrowIfNull(value.Headers); var formatterEntry = new FormatterEntry { StatusCode = value.StatusCode, Created = value.Created, Tags = value.Tags, Body = value.Body.Segments }; if (value.Headers != null) { formatterEntry.Headers = new(); foreach (var header in value.Headers) { formatterEntry.Headers.TryAdd(header.Key, header.Value.ToArray()); } } using var bufferStream = new MemoryStream(); JsonSerializer.Serialize(bufferStream, formatterEntry, FormatterEntrySerializerContext.Default.FormatterEntry); await store.SetAsync(key, bufferStream.ToArray(), value.Tags ?? Array.Empty <string>(), duration, cancellationToken); }
public async Task StoreAndGet_StoresEmptyValues() { var store = new TestOutputCache(); var key = "abc"; var entry = new OutputCacheEntry() { Body = new CachedResponseBody(new List <byte[]>(), 0), Headers = new HeaderDictionary(), Tags = Array.Empty <string>() }; await OutputCacheEntryFormatter.StoreAsync(key, entry, TimeSpan.Zero, store, default); var result = await OutputCacheEntryFormatter.GetAsync(key, store, default); AssertEntriesAreSame(entry, result); }
public void CreateCachedRawResponse_Should_Create_Equal_CachedRawResponse() { var buffers = new List <ResponseElement>(); buffers.Add(new OutputCacheFileResponseElement(DefaultHttpFileResponseElementFilePath, DefaultHttpFileResponseElementOffset, DefaultHttpFileResponseElementSize)); buffers.Add(new SubstitutionResponseElement(DefaultHttpResponseSubstitutionCallback)); buffers.Add(new MemoryResponseElement(DefaultHttpResponseBufferElementBuffer, DefaultHttpResponseBufferElementBufferSize)); var oce = new OutputCacheEntry() { CachedVaryId = DefaultVaryId, Dependencies = DefaultFileDep, DependenciesKey = DefaultDepKey, HeaderElements = DefaultRawResponseHeaders, KernelCacheUrl = DefaultKernelCacheUrl, Settings = new HttpCachePolicySettings(), StatusCode = DefaultRawResponseStatusCode, StatusDescription = DefaultRawResponseStatusDescription, ResponseBuffers = buffers }; var converter = new Converter(); var cachedRawResponse = converter.CreateCachedRawResponse(oce); Assert.Equal(oce.CachedVaryId, cachedRawResponse.CachedVaryId); Assert.Equal(oce.Settings, cachedRawResponse.CachePolicy); Assert.Equal(oce.KernelCacheUrl, cachedRawResponse.KernelCacheUrl); Assert.Equal(oce.StatusCode, cachedRawResponse.RawResponse.StatusCode); Assert.Equal(oce.StatusDescription, cachedRawResponse.RawResponse.StatusDescription); Assert.Equal(oce.HeaderElements, cachedRawResponse.RawResponse.Headers); Assert.Equal(3, cachedRawResponse.RawResponse.Buffers.Count); VerifyHttpFileResponseElement(cachedRawResponse.RawResponse.Buffers[0]); VerifyHttpSubstBlockResponseElement(cachedRawResponse.RawResponse.Buffers[1]); VerifyHttpResponseBufferElement(cachedRawResponse.RawResponse.Buffers[2]); }