https everywhere

This commit is contained in:
Fabian Freund
2024-06-25 15:20:00 +02:00
parent 10011c4c21
commit 3eca0dd419
2 changed files with 65 additions and 0 deletions
@@ -9,12 +9,16 @@ import 'package:html/dom.dart';
import 'package:html/parser.dart' as html_parser;
import 'package:http/http.dart' as http;
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:universal_io/io.dart';
part 'generic_website.g.dart';
@Riverpod(keepAlive: true)
class GenericWebsiteService extends _$GenericWebsiteService {
late http.Client _client;
final Map<String, bool> _httpsCache;
GenericWebsiteService() : _httpsCache = {};
@override
void build() {
@@ -101,4 +105,42 @@ class GenericWebsiteService extends _$GenericWebsiteService {
),
);
}
Future<Uri?> tryUpgradeToHttps(Uri httpUri) async {
if (httpUri.isScheme('https')) {
return httpUri;
} else if (httpUri.isScheme('http')) {
final cached = _httpsCache[httpUri.host];
if (cached != null) {
return cached ? httpUri.replace(scheme: 'https') : null;
}
var sslAvailable = false;
try {
final context = SecurityContext.defaultContext;
final socket = await SecureSocket.connect(
httpUri.host,
443,
context: context,
timeout: const Duration(seconds: 3),
);
await socket.close();
sslAvailable = true;
} catch (_) {
sslAvailable = false;
}
_httpsCache[httpUri.host] = sslAvailable;
if (sslAvailable) {
return httpUri.replace(scheme: 'https');
}
}
return null;
}
}
@@ -2,6 +2,7 @@ import 'dart:async';
import 'dart:convert';
import 'package:bang_navigator/core/logger.dart';
import 'package:bang_navigator/domain/services/generic_website.dart';
import 'package:bang_navigator/features/bangs/domain/providers.dart';
import 'package:bang_navigator/features/chat_archive/domain/entities/chat_entity.dart';
import 'package:bang_navigator/features/chat_archive/domain/repositories/archive.dart';
@@ -289,6 +290,28 @@ class _WebViewState extends ConsumerState<WebView> {
reasonPhrase: "Forbidden",
);
}
//Check if main page aka main frame is upgradeable
if (request.url.isScheme('http') &&
request.isForMainFrame == true) {
final upgradedUri = await ref
.read(genericWebsiteServiceProvider.notifier)
.tryUpgradeToHttps(request.url);
if (upgradedUri != null) {
unawaited(
controller.loadUrl(
urlRequest: URLRequest(url: WebUri.uri(upgradedUri)),
),
);
return WebResourceResponse(
statusCode: 200,
reasonPhrase: "Redirecting...",
);
}
}
return null;
},
onProgressChanged: (controller, progress) {