fix set cookie

This commit is contained in:
kodjomoustapha 2024-02-08 14:41:42 +01:00
parent b42c5eba69
commit 86902d862c
4 changed files with 18 additions and 112 deletions

View file

@ -88,7 +88,7 @@ class _MangaWebViewState extends ConsumerState<MangaWebView> {
"window.chrome.webview.postMessage(\"UA\" + navigator.userAgent)");
_windowsWebview.getCookies(widget.url).then((cookies) {
final cookie =
cookies.entries.map((e) => "${e.key}=${e.value}").join(";");
cookies.entries.map((e) => "${e.key}=${e.value}").join("; ");
MInterceptor.setCookie(_url, "", cookie: cookie);
});
}));

View file

@ -3,7 +3,6 @@ import 'package:http_interceptor/http_interceptor.dart';
import 'package:mangayomi/eval/model/m_bridge.dart';
import 'dart:async';
import 'dart:io';
import 'package:cookie_jar/cookie_jar.dart' as cookie_jar;
import 'package:mangayomi/eval/model/m_source.dart';
import 'package:mangayomi/main.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart'
@ -11,10 +10,6 @@ import 'package:flutter_inappwebview/flutter_inappwebview.dart'
import 'package:mangayomi/models/settings.dart';
class MInterceptor {
static final _cookieJar = cookie_jar.PersistCookieJar(
ignoreExpires: true,
storage: cookie_jar.FileStorage(
"${isar.settings.getSync(227)!.defaultAppStoragePath}.cookies/"));
static final flutter_inappwebview.CookieManager _cookieManager =
flutter_inappwebview.CookieManager.instance();
@ -22,10 +17,8 @@ class MInterceptor {
static InterceptedClient init(
{MSource? source, Map<String, dynamic>? reqcopyWith}) {
return InterceptedClient.build(interceptors: [
MCookieManager(_cookieJar, reqcopyWith),
LoggerInterceptor()
]);
return InterceptedClient.build(
interceptors: [MCookieManager(reqcopyWith), LoggerInterceptor()]);
}
static Map<String, String> getCookiesPref(String url) {
@ -41,25 +34,6 @@ class MInterceptor {
return {HttpHeaders.cookieHeader: cookies};
}
static Future<void> setCookiesPref(String url) async {
final host = Uri.parse(url).host;
final newCookie = (await _cookieJar.loadForRequest(Uri.parse(url)))
.map((e) => e.toString())
.join(";");
final settings = isar.settings.getSync(227);
List<MCookie>? cookieList = [];
for (var cookie in settings!.cookiesList ?? []) {
if (cookie.host != host) {
cookieList.add(cookie);
}
}
cookieList.add(MCookie()
..host = host
..cookie = newCookie);
isar.writeTxnSync(
() => isar.settings.putSync(settings..cookiesList = cookieList));
}
static Future<void> setCookie(String url, String ua, {String? cookie}) async {
List<String> cookies = [];
if (Platform.isWindows || Platform.isLinux) {
@ -75,13 +49,20 @@ class MInterceptor {
}
if (cookies.isNotEmpty) {
for (final cookie in cookies) {
await _cookieJar.saveFromResponse(
Uri.parse(url),
[Cookie.fromSetCookieValue(cookie)],
);
final host = Uri.parse(url).host;
final newCookie = cookies.join("; ");
final settings = isar.settings.getSync(227);
List<MCookie>? cookieList = [];
for (var cookie in settings!.cookiesList ?? []) {
if (cookie.host != host) {
cookieList.add(cookie);
}
}
await setCookiesPref(url);
cookieList.add(MCookie()
..host = host
..cookie = newCookie);
isar.writeTxnSync(
() => isar.settings.putSync(settings..cookiesList = cookieList));
}
if (ua.isNotEmpty) {
final settings = isar.settings.getSync(227);
@ -91,41 +72,15 @@ class MInterceptor {
}
class MCookieManager extends InterceptorContract {
MCookieManager(this.cookieJar, this.reqcopyWith);
MCookieManager(this.reqcopyWith);
Map<String, dynamic>? reqcopyWith;
final cookie_jar.CookieJar cookieJar;
static String getCookies(List<Cookie> cookies) {
cookies.sort((a, b) {
if (a.path == null && b.path == null) {
return 0;
} else if (a.path == null) {
return -1;
} else if (b.path == null) {
return 1;
} else {
return b.path!.length.compareTo(a.path!.length);
}
});
return cookies.map((cookie) => '${cookie.name}=${cookie.value}').join('; ');
}
@override
Future<BaseRequest> interceptRequest({
required BaseRequest request,
}) async {
final cookies = await cookieJar.loadForRequest(request.url);
final previousCookies = request.headers[HttpHeaders.cookieHeader];
final userAgent = isar.settings.getSync(227)!.userAgent!;
final newCookies = getCookies([
...?previousCookies
?.split(';')
.where((e) => e.isNotEmpty)
.map((c) => Cookie.fromSetCookieValue(c)),
...cookies,
]);
request.headers[HttpHeaders.cookieHeader] =
newCookies.isNotEmpty ? newCookies : "";
request.headers.addAll(MInterceptor.getCookiesPref(request.url.toString()));
request.headers[HttpHeaders.userAgentHeader] = userAgent;
try {
if (reqcopyWith != null) {
@ -150,40 +105,8 @@ class MCookieManager extends InterceptorContract {
Future<BaseResponse> interceptResponse({
required BaseResponse response,
}) async {
await _saveCookies(response);
return response;
}
Future<void> _saveCookies(BaseResponse response) async {
final setCookies = response.headers[HttpHeaders.setCookieHeader];
if (setCookies == null || setCookies.isEmpty) {
return;
}
try {
final List<Cookie> cookies = setCookies
.split(RegExp('(?<=)(,)(?=[^;]+?=)'))
.where((cookie) => cookie.isNotEmpty)
.map((str) => Cookie.fromSetCookieValue(str))
.toList();
final statusCode = response.statusCode;
final isRedirectRequest = statusCode >= 300 && statusCode < 400;
final location = response.headers[HttpHeaders.locationHeader] ?? "";
final originalUri = response.request!.url;
final realUri = originalUri
.resolveUri(isRedirectRequest ? Uri.parse(location) : originalUri);
await cookieJar.saveFromResponse(realUri, cookies);
await MInterceptor.setCookiesPref(realUri.toString());
if (isRedirectRequest && location.isNotEmpty) {
await Future.wait(
[cookieJar.saveFromResponse(originalUri.resolve(location), cookies)],
);
await MInterceptor.setCookiesPref(
originalUri.resolve(location).toString());
}
} catch (_) {}
}
}
class LoggerInterceptor extends InterceptorContract {

View file

@ -234,14 +234,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.1.1"
cookie_jar:
dependency: "direct main"
description:
name: cookie_jar
sha256: a6ac027d3ed6ed756bfce8f3ff60cb479e266f3b0fdabd6242b804b6765e52de
url: "https://pub.dev"
source: hosted
version: "4.0.8"
cross_file:
dependency: transitive
description:
@ -1428,14 +1420,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.3.2"
universal_io:
dependency: transitive
description:
name: universal_io
sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad"
url: "https://pub.dev"
source: hosted
version: "2.2.2"
universal_platform:
dependency: transitive
description:

View file

@ -67,7 +67,6 @@ dependencies:
ffi: ^2.1.0
ffigen: ^11.0.0
http_interceptor: ^2.0.0-beta.7
cookie_jar: ^4.0.0
http: ^1.2.0
flutter_windows_webview:
git: