< Summary

Information
Class: TeleFlow.Telegram.Internal.TelegramRetryAfterDelay
Assembly: TeleFlow.Telegram.Client
File(s): /_/src/TeleFlow.Telegram.Client/Internal/TelegramRetryAfterDelayResolver.cs
Line coverage
100%
Covered lines: 1
Uncovered lines: 0
Coverable lines: 1
Total lines: 74
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_Value()100%11100%

File(s)

/_/src/TeleFlow.Telegram.Client/Internal/TelegramRetryAfterDelayResolver.cs

#LineLine coverage
 1using System.Globalization;
 2
 3namespace TeleFlow.Telegram.Internal;
 4
 5internal static class TelegramRetryAfterDelayResolver
 6{
 7    public static TelegramRetryAfterDelay? ResolveDelay(
 8        TelegramTransportResponse response,
 9        TelegramTransportEnvelope? envelope,
 10        TimeProvider timeProvider)
 11    {
 12        ArgumentNullException.ThrowIfNull(response);
 13        ArgumentNullException.ThrowIfNull(timeProvider);
 14
 15        if (envelope?.ResponseParameters?.RetryAfter is long retryAfterFromEnvelope)
 16        {
 17            return CreateDelay(retryAfterFromEnvelope);
 18        }
 19
 20        return response.TryGetHeaderValues("Retry-After", out var values)
 21            ? ResolveHeaderDelay(values, timeProvider)
 22            : null;
 23    }
 24
 25    public static Task DelayAsync(
 26        TelegramRetryAfterDelay delay,
 27        TimeProvider timeProvider,
 28        CancellationToken cancellationToken)
 29    {
 30        return Task.Delay(delay.Value, timeProvider, cancellationToken);
 31    }
 32
 33    private static TelegramRetryAfterDelay? ResolveHeaderDelay(
 34        IReadOnlyList<string> retryAfterHeaderValues,
 35        TimeProvider timeProvider)
 36    {
 37        foreach (var value in retryAfterHeaderValues)
 38        {
 39            if (string.IsNullOrWhiteSpace(value))
 40            {
 41                continue;
 42            }
 43
 44            if (long.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var deltaSeconds))
 45            {
 46                return CreateDelay(deltaSeconds);
 47            }
 48
 49            if (DateTimeOffset.TryParse(
 50                    value,
 51                    CultureInfo.InvariantCulture,
 52                    DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal,
 53                    out var date))
 54            {
 55                var seconds = Math.Ceiling((date - timeProvider.GetUtcNow()).TotalSeconds);
 56                return CreateDelay((long)Math.Max(seconds, 0));
 57            }
 58        }
 59
 60        return null;
 61    }
 62
 63    private static TelegramRetryAfterDelay? CreateDelay(long seconds)
 64    {
 65        return seconds is < 0 or > int.MaxValue
 66            ? null
 67            : new TelegramRetryAfterDelay((int)seconds);
 68    }
 69}
 70
 71internal readonly record struct TelegramRetryAfterDelay(int Seconds)
 72{
 1873    public TimeSpan Value => TimeSpan.FromSeconds(Seconds);
 74}

Methods/Properties

get_Value()