< Summary

Information
Class: TeleFlow.Telegram.Internal.TelegramRetryAfterDelayResolver
Assembly: TeleFlow.Telegram.Client
File(s): /_/src/TeleFlow.Telegram.Client/Internal/TelegramRetryAfterDelayResolver.cs
Line coverage
66%
Covered lines: 16
Uncovered lines: 8
Coverable lines: 24
Total lines: 74
Line coverage: 66.6%
Branch coverage
72%
Covered branches: 16
Total branches: 22
Branch coverage: 72.7%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
ResolveDelay(...)100%88100%
DelayAsync(...)100%11100%
ResolveHeaderDelay(...)62.5%23838.46%
CreateDelay(...)50%66100%

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    {
 2312        ArgumentNullException.ThrowIfNull(response);
 2313        ArgumentNullException.ThrowIfNull(timeProvider);
 14
 2315        if (envelope?.ResponseParameters?.RetryAfter is long retryAfterFromEnvelope)
 16        {
 1217            return CreateDelay(retryAfterFromEnvelope);
 18        }
 19
 1120        return response.TryGetHeaderValues("Retry-After", out var values)
 1121            ? ResolveHeaderDelay(values, timeProvider)
 1122            : null;
 23    }
 24
 25    public static Task DelayAsync(
 26        TelegramRetryAfterDelay delay,
 27        TimeProvider timeProvider,
 28        CancellationToken cancellationToken)
 29    {
 830        return Task.Delay(delay.Value, timeProvider, cancellationToken);
 31    }
 32
 33    private static TelegramRetryAfterDelay? ResolveHeaderDelay(
 34        IReadOnlyList<string> retryAfterHeaderValues,
 35        TimeProvider timeProvider)
 36    {
 1237        foreach (var value in retryAfterHeaderValues)
 38        {
 439            if (string.IsNullOrWhiteSpace(value))
 40            {
 41                continue;
 42            }
 43
 444            if (long.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var deltaSeconds))
 45            {
 446                return CreateDelay(deltaSeconds);
 47            }
 48
 049            if (DateTimeOffset.TryParse(
 050                    value,
 051                    CultureInfo.InvariantCulture,
 052                    DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal,
 053                    out var date))
 54            {
 055                var seconds = Math.Ceiling((date - timeProvider.GetUtcNow()).TotalSeconds);
 056                return CreateDelay((long)Math.Max(seconds, 0));
 57            }
 58        }
 59
 060        return null;
 461    }
 62
 63    private static TelegramRetryAfterDelay? CreateDelay(long seconds)
 64    {
 1665        return seconds is < 0 or > int.MaxValue
 1666            ? null
 1667            : new TelegramRetryAfterDelay((int)seconds);
 68    }
 69}
 70
 71internal readonly record struct TelegramRetryAfterDelay(int Seconds)
 72{
 73    public TimeSpan Value => TimeSpan.FromSeconds(Seconds);
 74}