fix set cookie
This commit is contained in:
parent
b42c5eba69
commit
86902d862c
4 changed files with 18 additions and 112 deletions
|
|
@ -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);
|
||||
});
|
||||
}));
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
16
pubspec.lock
16
pubspec.lock
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Reference in a new issue