From 5f971dcddb6904282db968169539cb1d29745e58 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 13 Jun 2025 16:49:59 -0400 Subject: [PATCH] HTML bugfix: Incorrect URL resolution on redirected pages (#2315) --- lib/app_sources/html.dart | 7 +++++++ lib/providers/apps_provider.dart | 4 ++-- lib/providers/source_provider.dart | 12 ++++++------ 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/lib/app_sources/html.dart b/lib/app_sources/html.dart index b00f73e..9037f6d 100644 --- a/lib/app_sources/html.dart +++ b/lib/app_sources/html.dart @@ -9,6 +9,13 @@ import 'package:obtainium/providers/apps_provider.dart'; import 'package:obtainium/providers/source_provider.dart'; String ensureAbsoluteUrl(String ambiguousUrl, Uri referenceAbsoluteUrl) { + try { + if (Uri.parse(ambiguousUrl).isAbsolute) { + return ambiguousUrl; // #2315 + } + } catch (e) { + // + } return referenceAbsoluteUrl.resolve(ambiguousUrl).toString(); } diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index be14f75..ad506f0 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -360,8 +360,8 @@ Future downloadFile(String url, String fileName, bool fileNameHasExt, } var responseWithClient = await sourceRequestStreamResponse('GET', url, reqHeaders, {}); - HttpClient responseClient = responseWithClient.key; - HttpClientResponse response = responseWithClient.value; + HttpClient responseClient = responseWithClient.value.key; + HttpClientResponse response = responseWithClient.value.value; sink ??= tempDownloadedFile.openWrite(mode: FileMode.writeOnly); // Perform the download diff --git a/lib/providers/source_provider.dart b/lib/providers/source_provider.dart index 1555074..72d88cd 100644 --- a/lib/providers/source_provider.dart +++ b/lib/providers/source_provider.dart @@ -511,7 +511,7 @@ HttpClient createHttpClient(bool insecure) { return client; } -Future> sourceRequestStreamResponse( +Future>> sourceRequestStreamResponse( String method, String url, Map? requestHeaders, @@ -551,7 +551,7 @@ Future> sourceRequestStreamResponse( } } - return MapEntry(httpClient, response); + return MapEntry(currentUrl, MapEntry(httpClient, response)); } throw ObtainiumError('Too many redirects ($maxRedirects)'); } @@ -637,14 +637,14 @@ abstract class AppSource { {bool followRedirects = true, Object? postBody}) async { var method = postBody == null ? 'GET' : 'POST'; var requestHeaders = await getRequestHeaders(additionalSettings); - var streamedResponseAndClient = await sourceRequestStreamResponse( + var streamedResponseUrlWithResponseAndClient = await sourceRequestStreamResponse( method, url, requestHeaders, additionalSettings, followRedirects: followRedirects, postBody: postBody); return await httpClientResponseStreamToFinalResponse( - streamedResponseAndClient.key, + streamedResponseUrlWithResponseAndClient.value.key, method, - url, - streamedResponseAndClient.value); + streamedResponseUrlWithResponseAndClient.key.toString(), + streamedResponseUrlWithResponseAndClient.value.value); } void runOnAddAppInputChange(String inputUrl) {