From bc2febf48064456718a2e4b8f86edca172224302 Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Tue, 7 Apr 2026 05:45:12 +0200 Subject: [PATCH] fix: prefer https endpoints, catch h2 protocol errors --- lib/services/plex_auth_service.dart | 13 +++++++------ lib/utils/http_client.dart | 7 +++++++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/lib/services/plex_auth_service.dart b/lib/services/plex_auth_service.dart index 09c07ed8..7db030fb 100644 --- a/lib/services/plex_auth_service.dart +++ b/lib/services/plex_auth_service.dart @@ -795,18 +795,19 @@ class PlexServer { ) { if (entries.isEmpty) return null; - // Sort by latency first, then by protocol (HTTPS > HTTP), then by URL type (prefer plex.direct) + // Sort by protocol first (HTTPS enables H2 multiplexing), then latency, then URL type entries.sort((a, b) { - final latencyCompare = a.value.latencyMs.compareTo(b.value.latencyMs); - if (latencyCompare != 0) return latencyCompare; - - // If latencies are equal, prefer HTTPS over HTTP + // Prefer HTTPS over HTTP final aIsHttps = a.key.isHttps; final bIsHttps = b.key.isHttps; if (aIsHttps && !bIsHttps) return -1; if (!aIsHttps && bIsHttps) return 1; - // If latencies and protocols are equal, prefer plex.direct URI (isPlexDirectUri = true) + // Within same protocol, sort by latency + final latencyCompare = a.value.latencyMs.compareTo(b.value.latencyMs); + if (latencyCompare != 0) return latencyCompare; + + // Prefer plex.direct URI on tie if (a.key.isPlexDirectUri && !b.key.isPlexDirectUri) return -1; if (!a.key.isPlexDirectUri && b.key.isPlexDirectUri) return 1; return 0; diff --git a/lib/utils/http_client.dart b/lib/utils/http_client.dart index 0158e3df..e1c3030e 100644 --- a/lib/utils/http_client.dart +++ b/lib/utils/http_client.dart @@ -43,6 +43,13 @@ class _Http2WithFallbackAdapter implements HttpClientAdapter { appLogger.d('H2 handshake failed for ${options.uri.host}, falling back to HTTP/1.1'); _http1Hosts.add(options.uri.host); return _http1Fallback.fetch(options, requestStream, cancelFuture); + } catch (e) { + if (e.toString().contains('HTTP/2')) { + appLogger.d('H2 connection error for ${options.uri.host}, falling back to HTTP/1.1'); + _http1Hosts.add(options.uri.host); + return _http1Fallback.fetch(options, requestStream, cancelFuture); + } + rethrow; } }