< Summary

Information
Class: Elsa.Api.Client.Extensions.ApiResponseExtensions
Assembly: Elsa.Api.Client
File(s): /home/runner/work/elsa-core/elsa-core/src/clients/Elsa.Api.Client/Extensions/ApiResponseExtensions.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 16
Coverable lines: 16
Total lines: 49
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 12
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
GetDownloadedFileNameOrDefault(...)0%156120%

File(s)

/home/runner/work/elsa-core/elsa-core/src/clients/Elsa.Api.Client/Extensions/ApiResponseExtensions.cs

#LineLine coverage
 1using JetBrains.Annotations;
 2using Refit;
 3
 4namespace Elsa.Api.Client.Extensions;
 5
 6/// <summary>
 7/// Provides extension methods for <see cref="IApiResponse"/>.
 8/// </summary>
 9[UsedImplicitly]
 10public static class ApiResponseExtensions
 11{
 12    /// <summary>
 13    /// Returns the downloaded file name or the specified default file name.
 14    /// </summary>
 15    public static string GetDownloadedFileNameOrDefault(this IApiResponse response, string defaultFileName = "download.b
 16    {
 017        var fileName = defaultFileName;
 18
 019        if (response.ContentHeaders is null)
 020            return fileName;
 21
 022        if (!response.ContentHeaders.TryGetValues("content-disposition", out var contentDispositionHeader)) // Only avai
 023            return fileName;
 24
 025        var contentDisposition = contentDispositionHeader.FirstOrDefault();
 26
 027        if (string.IsNullOrWhiteSpace(contentDisposition))
 028            return fileName;
 29
 30        // Parse the Content-Disposition header value (e.g., "attachment; filename=workflow-definitions.zip; filename*=U
 31        // Split by semicolon and look for the filename parameter
 032        var parts = contentDisposition.Split(';', StringSplitOptions.RemoveEmptyEntries);
 33
 034        foreach (var part in parts)
 35        {
 036            var trimmedPart = part.Trim();
 37
 38            // Look for filename= (prefer this over filename* for simplicity)
 039            if (!trimmedPart.StartsWith("filename=", StringComparison.OrdinalIgnoreCase) ||
 040                trimmedPart.StartsWith("filename*=", StringComparison.OrdinalIgnoreCase))
 41                continue;
 42
 043            fileName = trimmedPart["filename=".Length..].Trim('"', '\'');
 044            break;
 45        }
 46
 047        return fileName;
 48    }
 49}