control where to show cloudflare error message

This commit is contained in:
kodjomoustapha 2024-10-29 13:28:16 +01:00
parent a6ccf0e77e
commit c10f7d120a
8 changed files with 49 additions and 16 deletions

View file

@ -26,7 +26,7 @@ class ImageViewPaged extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final scaleType = ref.watch(scaleTypeStateProvider);
final image = data.getImageProvider(ref);
final image = data.getImageProvider(ref, true);
return GestureDetector(
onLongPress: () => onLongPressData.call(data),
child: ColorFilterWidget(

View file

@ -27,7 +27,7 @@ class ImageViewVertical extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final imageWidget = ExtendedImage(
image: data.getImageProvider(ref),
image: data.getImageProvider(ref, true),
filterQuality: FilterQuality.medium,
handleLoadingProgress: true,
fit: getBoxFit(ref.watch(scaleTypeStateProvider)),

View file

@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_windows_webview/flutter_windows_webview.dart';
import 'package:go_router/go_router.dart';
import 'package:mangayomi/providers/l10n_providers.dart';
import 'package:mangayomi/services/http/m_client.dart';
import 'package:mangayomi/utils/global_style.dart';
@ -79,7 +80,12 @@ class _MangaWebViewState extends ConsumerState<MangaWebView> {
child: SafeArea(
child: WillPopScope(
onWillPop: () async {
_webViewController?.goBack();
final canGoback = await _webViewController?.canGoBack();
if (canGoback ?? false) {
_webViewController?.goBack();
} else if (context.mounted) {
context.pop();
}
return false;
},
child: Column(

View file

@ -34,6 +34,7 @@ class CustomExtendedNetworkImageProvider
this.cancelToken,
this.imageCacheName,
this.cacheMaxAge = const Duration(days: 30),
this.showCloudFlareError = false,
});
/// The name of [ImageCache], you can define custom [ImageCache] to store this provider.
@ -92,6 +93,8 @@ class CustomExtendedNetworkImageProvider
@override
final Duration? cacheMaxAge;
final bool showCloudFlareError;
@override
ImageStreamCompleter loadImage(
image_provider.ExtendedNetworkImageProvider key,
@ -278,7 +281,19 @@ class CustomExtendedNetworkImageProvider
var request = Request('GET', resolved);
request.headers.addAll(headers ?? {});
StreamedResponse response = await MClient.init().send(request);
StreamedResponse response =
await MClient.init(showCloudFlareError: showCloudFlareError)
.send(request);
if (response.request != null) {
final res = await MClient.init(
reqcopyWith: {'useDartHttpClient': true},
showCloudFlareError: showCloudFlareError)
.send(response.request!);
if (![403, 503].contains(res.statusCode) &&
["cloudflare-nginx", "cloudflare"].contains(res.headers["server"])) {
return res;
}
}
return response;
}

View file

@ -40,10 +40,14 @@ class MClient {
static InterceptedClient init(
{MSource? source,
Map<String, dynamic>? reqcopyWith,
rhttp.ClientSettings? settings}) {
rhttp.ClientSettings? settings,
bool showCloudFlareError = true}) {
return InterceptedClient.build(
client: httpClient(settings: settings, reqcopyWith: reqcopyWith),
interceptors: [MCookieManager(reqcopyWith), LoggerInterceptor()]);
interceptors: [
MCookieManager(reqcopyWith),
LoggerInterceptor(showCloudFlareError)
]);
}
static Map<String, String> getCookiesPref(String url) {
@ -158,6 +162,8 @@ class MCookieManager extends InterceptorContract {
}
class LoggerInterceptor extends InterceptorContract {
LoggerInterceptor(this.showCloudFlareError);
bool showCloudFlareError;
@override
Future<BaseRequest> interceptRequest({
required BaseRequest request,
@ -171,14 +177,18 @@ class LoggerInterceptor extends InterceptorContract {
Future<BaseResponse> interceptResponse({
required BaseResponse response,
}) async {
final cloudflare = [403, 503].contains(response.statusCode) &&
["cloudflare-nginx", "cloudflare"].contains(response.headers["server"]);
Logger.add(LoggerLevel.info,
"----- Response -----\n${response.request?.method}: ${response.request?.url}, statusCode: ${response.statusCode} ${cloudflare ? "Failed to bypass Cloudflare" : ""}");
if (cloudflare) {
botToast("${response.statusCode} Failed to bypass Cloudflare",
hasCloudFlare: cloudflare, url: response.request!.url.toString());
if (showCloudFlareError) {
final cloudflare = [403, 503].contains(response.statusCode) &&
["cloudflare-nginx", "cloudflare"]
.contains(response.headers["server"]);
Logger.add(LoggerLevel.info,
"----- Response -----\n${response.request?.method}: ${response.request?.url}, statusCode: ${response.statusCode} ${cloudflare ? "Failed to bypass Cloudflare" : ""}");
if (cloudflare) {
botToast("${response.statusCode} Failed to bypass Cloudflare",
hasCloudFlare: cloudflare, url: response.request!.url.toString());
}
}
return response;
}
}

View file

@ -59,7 +59,8 @@ extension UChapDataPreloadExtensions on UChapDataPreload {
return imageBytes;
}
ImageProvider<Object> getImageProvider(WidgetRef ref) {
ImageProvider<Object> getImageProvider(
WidgetRef ref, bool showCloudFlareError) {
final data = this;
final isLocale = data.isLocale!;
final archiveImage = data.archiveImage;
@ -75,6 +76,7 @@ extension UChapDataPreloadExtensions on UChapDataPreload {
data.pageUrl!.url.trim().trimLeft().trimRight(),
cache: true,
cacheMaxAge: const Duration(days: 7),
showCloudFlareError: showCloudFlareError,
headers: {
...data.pageUrl!.headers ?? {},
...ref.watch(headersProvider(

View file

@ -1796,5 +1796,5 @@ packages:
source: hosted
version: "2.2.1"
sdks:
dart: ">=3.5.3 <4.0.0"
dart: ">=3.5.4 <4.0.0"
flutter: ">=3.24.0"

View file

@ -4,7 +4,7 @@ publish_to: "none"
version: 0.3.6+69
environment:
sdk: ">=3.5.3 <4.0.0"
sdk: ">=3.5.4 <4.0.0"
dependencies:
flutter: