From 1c040384d964ffe4806a452b64dd9e7245365777 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 17 Aug 2025 14:48:13 +0200 Subject: [PATCH] feat: Use rhttp package for http3 usage --- lib/main.dart | 3 +++ lib/utils/client_manager.dart | 2 +- lib/utils/custom_http_client.dart | 25 +++++++++++++++++++------ linux/flutter/generated_plugins.cmake | 1 + macos/Podfile.lock | 8 +++++--- pubspec.lock | 24 ++++++++++++++++++++++++ pubspec.yaml | 1 + windows/flutter/generated_plugins.cmake | 1 + 8 files changed, 55 insertions(+), 10 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index f3be9dc52..fb17aa90f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,9 +1,11 @@ +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:collection/collection.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_vodozemac/flutter_vodozemac.dart' as vod; import 'package:matrix/matrix.dart'; +import 'package:rhttp/rhttp.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:fluffychat/config/app_config.dart'; @@ -22,6 +24,7 @@ void main() async { WidgetsFlutterBinding.ensureInitialized(); await vod.init(wasmPath: './assets/assets/vodozemac/'); + if (!kIsWeb) await Rhttp.init(); Logs().nativeColors = !PlatformInfos.isIOS; final store = await SharedPreferences.getInstance(); diff --git a/lib/utils/client_manager.dart b/lib/utils/client_manager.dart index 5c5a07663..6fad0b847 100644 --- a/lib/utils/client_manager.dart +++ b/lib/utils/client_manager.dart @@ -106,7 +106,7 @@ abstract class ClientManager { return Client( clientName, - httpClient: CustomHttpClient.createHTTPClient(), + httpClient: await CustomHttpClient.createHTTPClient(), verificationMethods: { KeyVerificationMethod.numbers, if (kIsWeb || PlatformInfos.isMobile || PlatformInfos.isLinux) diff --git a/lib/utils/custom_http_client.dart b/lib/utils/custom_http_client.dart index b0a3dcb28..50c6d02c5 100644 --- a/lib/utils/custom_http_client.dart +++ b/lib/utils/custom_http_client.dart @@ -1,9 +1,12 @@ import 'dart:convert'; import 'dart:io'; +import 'package:flutter/foundation.dart'; + +import 'package:device_info_plus/device_info_plus.dart'; import 'package:http/http.dart' as http; import 'package:http/io_client.dart'; -import 'package:http/retry.dart' as retry; +import 'package:rhttp/rhttp.dart'; import 'package:fluffychat/config/isrg_x1.dart'; import 'package:fluffychat/utils/platform_infos.dart'; @@ -32,9 +35,19 @@ class CustomHttpClient { return HttpClient(context: context); } - static http.Client createHTTPClient() => retry.RetryClient( - PlatformInfos.isAndroid - ? IOClient(customHttpClient(ISRG_X1)) - : http.Client(), - ); + static Future createHTTPClient() async { + if (kIsWeb) return http.Client(); + + final needsLetsEncryptCert = PlatformInfos.isAndroid + ? (await DeviceInfoPlugin().androidInfo).version.sdkInt < 25 + : false; + + if (needsLetsEncryptCert) { + return IOClient(customHttpClient(ISRG_X1)); + } + + return await RhttpCompatibleClient.create( + interceptors: [RetryInterceptor()], + ); + } } diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 9d145db6f..f3565c8c4 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -19,6 +19,7 @@ list(APPEND FLUTTER_PLUGIN_LIST list(APPEND FLUTTER_FFI_PLUGIN_LIST flutter_vodozemac + rhttp ) set(PLUGIN_BUNDLED_LIBRARIES) diff --git a/macos/Podfile.lock b/macos/Podfile.lock index d79606925..e466c8594 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -42,6 +42,8 @@ PODS: - FlutterMacOS - record_macos (1.1.0): - FlutterMacOS + - rhttp (0.0.1): + - FlutterMacOS - share_plus (0.0.1): - FlutterMacOS - shared_preferences_foundation (0.0.1): @@ -70,11 +72,8 @@ PODS: DEPENDENCIES: - app_links (from `Flutter/ephemeral/.symlinks/plugins/app_links/macos`) - - audio_session (from `Flutter/ephemeral/.symlinks/plugins/audio_session/macos`) - desktop_drop (from `Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos`) - - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) - dynamic_color (from `Flutter/ephemeral/.symlinks/plugins/dynamic_color/macos`) - - emoji_picker_flutter (from `Flutter/ephemeral/.symlinks/plugins/emoji_picker_flutter/macos`) - file_picker (from `Flutter/ephemeral/.symlinks/plugins/file_picker/macos`) - file_selector_macos (from `Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos`) - flutter_local_notifications (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos`) @@ -89,6 +88,7 @@ DEPENDENCIES: - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`) - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) - record_macos (from `Flutter/ephemeral/.symlinks/plugins/record_macos/macos`) + - rhttp (from `Flutter/ephemeral/.symlinks/plugins/rhttp/macos`) - share_plus (from `Flutter/ephemeral/.symlinks/plugins/share_plus/macos`) - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`) - sqlcipher_flutter_libs (from `Flutter/ephemeral/.symlinks/plugins/sqlcipher_flutter_libs/macos`) @@ -144,6 +144,8 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin record_macos: :path: Flutter/ephemeral/.symlinks/plugins/record_macos/macos + rhttp: + :path: Flutter/ephemeral/.symlinks/plugins/rhttp/macos share_plus: :path: Flutter/ephemeral/.symlinks/plugins/share_plus/macos shared_preferences_foundation: diff --git a/pubspec.lock b/pubspec.lock index 5be66a597..66499c57d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -708,6 +708,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" + freezed_annotation: + dependency: transitive + description: + name: freezed_annotation + sha256: "7294967ff0a6d98638e7acb774aac3af2550777accd8149c90af5b014e6d44d8" + url: "https://pub.dev" + source: hosted + version: "3.1.0" frontend_server_client: dependency: transitive description: @@ -881,6 +889,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.1.2" + http_profile: + dependency: transitive + description: + name: http_profile + sha256: "7e679e355b09aaee2ab5010915c932cce3f2d1c11c3b2dc177891687014ffa78" + url: "https://pub.dev" + source: hosted + version: "0.1.0" image: dependency: "direct main" description: @@ -1542,6 +1558,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.2" + rhttp: + dependency: "direct main" + description: + name: rhttp + sha256: "9dc9608187979c98cdb9164f0ef037ec65b14584c4ef6c866744170fa508cf8e" + url: "https://pub.dev" + source: hosted + version: "0.12.0" rxdart: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index dd9557fc3..edd48c6b6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -68,6 +68,7 @@ dependencies: qr_image: ^1.0.0 receive_sharing_intent: ^1.8.1 record: ^6.1.1 + rhttp: ^0.12.0 scroll_to_index: ^3.0.1 share_plus: ^11.1.0 shared_preferences: ^2.2.0 # Pinned because https://github.com/flutter/flutter/issues/118401 diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 3276ee890..d4a811b2c 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -22,6 +22,7 @@ list(APPEND FLUTTER_PLUGIN_LIST list(APPEND FLUTTER_FFI_PLUGIN_LIST flutter_local_notifications_windows flutter_vodozemac + rhttp ) set(PLUGIN_BUNDLED_LIBRARIES)