Refine redirect handling follow-ups

Co-authored-by: cheahkhing <563883+cheahkhing@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot] 2026-03-08 14:26:07 +00:00
parent d97eee684f
commit f0ce4eb997
2 changed files with 16 additions and 6 deletions

View File

@ -17,6 +17,7 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist
/// </summary>
public class TubeArchivistApi
{
private const int MaxRedirectCount = 10;
private ILogger _logger;
private HttpClient client;
private static TubeArchivistApi _taApiInstance = null!;
@ -62,11 +63,11 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist
private static bool IsRedirectStatusCode(HttpStatusCode statusCode)
{
return statusCode == HttpStatusCode.Moved
return statusCode == HttpStatusCode.Moved
|| statusCode == HttpStatusCode.Redirect
|| statusCode == HttpStatusCode.RedirectMethod
|| statusCode == HttpStatusCode.TemporaryRedirect
|| (int)statusCode == 308;
|| statusCode == HttpStatusCode.PermanentRedirect;
}
private static Uri ResolveTubeArchivistUri(string? url)
@ -80,14 +81,19 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist
var response = await client.GetAsync(resolvedUrl).ConfigureAwait(true);
var redirectCount = 0;
while (IsRedirectStatusCode(response.StatusCode) && response.Headers.Location != null && redirectCount < 10)
while (IsRedirectStatusCode(response.StatusCode) && response.Headers.Location != null && redirectCount < MaxRedirectCount)
{
resolvedUrl = ResolveTubeArchivistUri(response.Headers.Location.OriginalString);
_logger.LogDebug("{Message}", "Received redirect to: " + resolvedUrl);
_logger.LogDebug("Received redirect to: {ResolvedUrl}", resolvedUrl);
response = await client.GetAsync(resolvedUrl).ConfigureAwait(true);
redirectCount++;
}
if (redirectCount >= MaxRedirectCount && IsRedirectStatusCode(response.StatusCode) && response.Headers.Location != null)
{
_logger.LogWarning("Stopped following TubeArchivist redirect chain after {RedirectCount} redirects. Last location: {RedirectLocation}", redirectCount, response.Headers.Location);
}
return response;
}

View File

@ -81,8 +81,12 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Utilities
/// Resolves a URL against the configured TubeArchivist base URL.
/// </summary>
/// <param name="baseUrl">Configured TubeArchivist base URL.</param>
/// <param name="url">The relative or absolute URL to resolve.</param>
/// <returns>A resolved absolute <see cref="Uri"/>.</returns>
/// <param name="url">The relative or absolute URL to resolve. If null or whitespace, the base URL is returned.</param>
/// <returns>
/// A resolved absolute <see cref="Uri"/>.
/// Absolute URLs pointing to a different origin keep only their path, query and fragment,
/// so requests stay pinned to the configured TubeArchivist host.
/// </returns>
public static Uri ResolveUrl(string baseUrl, string? url)
{
var sanitizedBaseUrl = SanitizeUrl(baseUrl);