Exemplo n.º 1
0
    public Task FromPath()
    {
        var timestamps = new List <Timestamp>();

        foreach (var file in new[]
        {
            "/Dir/92cb8761e3e5246f873da524f438f95468eb3d36_2021-03-22T095023_S{etag}.bin",
            "/Dir/92cb8761e3e5246f873da524f438f95468eb3d36_2021-03-22T095023_Setag.bin",
            "/Dir/92cb8761e3e5246f873da524f438f95468eb3d36_2021-03-22T095023_W{etag}.bin",
            "/Dir/92cb8761e3e5246f873da524f438f95468eb3d36_2021-03-22T095023_Wetag.bin",
            "/Dir/92cb8761e3e5246f873da524f438f95468eb3d36_2021-03-22T095023_.bin",
        })
        {
            timestamps.Add(Timestamp.FromPath(file));
        }

        return(Verifier.Verify(timestamps));
    }
Exemplo n.º 2
0
        Result HandleFileExists(
            Uri uri,
            bool staleIfError,
            Action <HttpRequestMessage>?modifyRequest,
            FilePair contentFile,
            CancellationToken token)
        {
            var now = DateTimeOffset.UtcNow;

            var timestamp = Timestamp.FromPath(contentFile.Content);

            if (timestamp.Expiry > now)
            {
                return(new(contentFile, false, false));
            }

            using var request = BuildRequest(uri, modifyRequest);
            timestamp.ApplyHeadersToRequest(request);

            HttpResponseMessage?response;

            var httpClient = GetClient();

            try
            {
                response = httpClient.SendEx(request, token);
            }
            catch (Exception exception)
            {
                if (ShouldReturnStaleIfError(staleIfError, exception, token))
                {
                    return(new(contentFile, true, false));
                }

                throw;
            }

            var status = response.CacheStatus(staleIfError);

            switch (status)
            {
            case CacheStatus.Hit:
            case CacheStatus.UseStaleDueToError:
            {
                response.Dispose();
                return(new(contentFile, true, false));
            }

            case CacheStatus.Stored:
            case CacheStatus.Revalidate:
            {
                using (response)
                {
                    return(AddItem(response, uri, token));
                }
            }

            case CacheStatus.NoStore:
            {
                return(new(response));
            }

            default:
            {
                response.Dispose();
                throw new ArgumentOutOfRangeException();
            }
            }
        }