Example #1
0
    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);
    }
Example #3
0
    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);
    }
Example #4
0
        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]);
        }