新增调试信息
This commit is contained in:
@@ -3,10 +3,13 @@ import '../services/api_service/kr_api.user.dart';
|
||||
import '../utils/kr_update_util.dart';
|
||||
import '../utils/kr_secure_storage.dart';
|
||||
import '../utils/kr_log_util.dart';
|
||||
import '../services/singbox_imp/kr_sing_box_imp.dart';
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
import 'dart:math';
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:dio/io.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
/// 协议配置
|
||||
@@ -54,7 +57,27 @@ class KRDomain {
|
||||
static Map<String, int> _domainResponseTimes = {}; // 域名响应时间记录
|
||||
static Map<String, DateTime> _domainLastCheck = {}; // 域名最后检测时间
|
||||
static const int _domainCacheDuration = 300; // 域名缓存时间(秒)
|
||||
static final Dio _dio = Dio(); // Dio 实例
|
||||
|
||||
// Dio 实例及初始化
|
||||
static final Dio _dio = (() {
|
||||
final dio = Dio();
|
||||
// 🔧 配置HttpClientAdapter使用sing-box的mixed代理
|
||||
dio.httpClientAdapter = IOHttpClientAdapter(
|
||||
createHttpClient: () {
|
||||
final client = HttpClient();
|
||||
client.findProxy = (url) {
|
||||
final proxyConfig = KRSingBoxImp.instance.kr_buildProxyRule();
|
||||
KRLogUtil.kr_i(
|
||||
'🔍 KRDomain 请求使用代理: $proxyConfig, url: $url',
|
||||
tag: 'KRDomain',
|
||||
);
|
||||
return proxyConfig;
|
||||
};
|
||||
return client;
|
||||
},
|
||||
);
|
||||
return dio;
|
||||
})();
|
||||
|
||||
/// API 域名
|
||||
static String get kr_api => kr_currentDomain;
|
||||
@@ -1032,12 +1055,13 @@ class AppConfig {
|
||||
|
||||
/// 请求域名地址
|
||||
/// 基础url
|
||||
///
|
||||
// static String baseUrl = "http://103.112.98.72:8088";
|
||||
|
||||
/// 请求域名地址调试模式
|
||||
String get baseUrl {
|
||||
if (kDebugMode) {
|
||||
return "https://api.maodag.top";
|
||||
return "http://154.12.35.103:8080";
|
||||
}
|
||||
return "${KRProtocol.kr_https}://${KRDomain.kr_api}";
|
||||
}
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:io' show Platform;
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:dio/io.dart';
|
||||
|
||||
// import 'package:flutter_easyloading/flutter_easyloading.dart'; // 已替换为自定义组件
|
||||
import 'package:flutter_loggy_dio/flutter_loggy_dio.dart';
|
||||
@@ -11,6 +12,7 @@ import 'package:kaer_with_panels/app/common/app_run_data.dart';
|
||||
import 'package:kaer_with_panels/app/network/base_response.dart';
|
||||
import 'package:kaer_with_panels/app/localization/kr_language_utils.dart';
|
||||
import 'package:kaer_with_panels/app/utils/kr_common_util.dart';
|
||||
import 'package:kaer_with_panels/app/services/singbox_imp/kr_sing_box_imp.dart';
|
||||
import 'package:kaer_with_panels/app/services/kr_site_config_service.dart';
|
||||
|
||||
// import 'package:crypto/crypto.dart';
|
||||
@@ -44,6 +46,7 @@ class HttpUtil {
|
||||
|
||||
/// 对dio进行配置
|
||||
void initDio() {
|
||||
KRLogUtil.kr_i('🚀 HttpUtil.initDio() 开始初始化', tag: 'HttpUtil');
|
||||
// 不使用 Loggy,改用自定义简洁拦截器
|
||||
_dio.interceptors.add(_KRSimpleHttpInterceptor());
|
||||
_dio.options.baseUrl = AppConfig.getInstance().baseUrl;
|
||||
@@ -67,6 +70,26 @@ class HttpUtil {
|
||||
_dio.options.validateStatus = (status) {
|
||||
return status != null && status >= 200 && status < 500;
|
||||
};
|
||||
|
||||
// 🔧 配置HttpClientAdapter 优先走本地 sing-box mixed 端口,
|
||||
// 若代理不可用则回退到直连
|
||||
KRLogUtil.kr_i('🔧 配置 HttpClientAdapter...', tag: 'HttpUtil');
|
||||
_dio.httpClientAdapter = IOHttpClientAdapter(
|
||||
createHttpClient: () {
|
||||
KRLogUtil.kr_i('📱 createHttpClient 回调被调用', tag: 'HttpUtil');
|
||||
final client = HttpClient();
|
||||
client.findProxy = (url) {
|
||||
final proxyConfig = KRSingBoxImp.instance.kr_buildProxyRule();
|
||||
KRLogUtil.kr_i(
|
||||
'🔍 findProxy 被调用, url: $url, proxy: $proxyConfig',
|
||||
tag: 'HttpUtil',
|
||||
);
|
||||
return proxyConfig;
|
||||
};
|
||||
return client;
|
||||
},
|
||||
);
|
||||
KRLogUtil.kr_i('✅ HttpUtil.initDio() 初始化完成', tag: 'HttpUtil');
|
||||
}
|
||||
|
||||
/// 更新baseUrl
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import 'dart:io';
|
||||
import 'dart:io' as io;
|
||||
import 'dart:math';
|
||||
import 'dart:convert';
|
||||
import 'package:dio/io.dart' as dio_io;
|
||||
|
||||
import 'package:fpdart/fpdart.dart';
|
||||
import 'package:get/get.dart';
|
||||
@@ -20,6 +21,7 @@ import '../kr_device_info_service.dart';
|
||||
import '../kr_site_config_service.dart';
|
||||
import '../../common/app_config.dart';
|
||||
import 'package:dio/dio.dart' as dio;
|
||||
import 'package:kaer_with_panels/app/services/singbox_imp/kr_sing_box_imp.dart';
|
||||
|
||||
class KRAuthApi {
|
||||
/// 检查账号是否已注册(仅支持邮箱)
|
||||
@@ -227,6 +229,24 @@ class KRAuthApi {
|
||||
|
||||
// 使用 Dio 直接发送请求(因为需要特殊的加密处理)
|
||||
final dioInstance = dio.Dio();
|
||||
|
||||
// 🔧 配置HttpClientAdapter优先使用本地 sing-box mixed 端口,
|
||||
// 失败时退回直连
|
||||
dioInstance.httpClientAdapter = dio_io.IOHttpClientAdapter(
|
||||
createHttpClient: () {
|
||||
final client = io.HttpClient();
|
||||
client.findProxy = (url) {
|
||||
final proxyConfig = KRSingBoxImp.instance.kr_buildProxyRule();
|
||||
KRLogUtil.kr_i(
|
||||
'🔍 KRAuthApi 请求使用代理: $proxyConfig, url: $url',
|
||||
tag: 'KRAuthApi',
|
||||
);
|
||||
return proxyConfig;
|
||||
};
|
||||
return client;
|
||||
},
|
||||
);
|
||||
|
||||
final baseUrl = AppConfig.getInstance().baseUrl;
|
||||
final url = '$baseUrl${Api.kr_deviceLogin}';
|
||||
|
||||
@@ -313,17 +333,17 @@ class KRAuthApi {
|
||||
}
|
||||
|
||||
String _kr_getUserAgent() {
|
||||
if (Platform.isAndroid) {
|
||||
if (io.Platform.isAndroid) {
|
||||
return 'android';
|
||||
} else if (Platform.isIOS) {
|
||||
} else if (io.Platform.isIOS) {
|
||||
return 'ios';
|
||||
} else if (Platform.isMacOS) {
|
||||
} else if (io.Platform.isMacOS) {
|
||||
return 'mac';
|
||||
} else if (Platform.isWindows) {
|
||||
} else if (io.Platform.isWindows) {
|
||||
return 'windows';
|
||||
} else if (Platform.isLinux) {
|
||||
} else if (io.Platform.isLinux) {
|
||||
return 'linux';
|
||||
} else if (Platform.isFuchsia) {
|
||||
} else if (io.Platform.isFuchsia) {
|
||||
return 'harmony';
|
||||
} else {
|
||||
return 'unknown';
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
import 'dart:io';
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:dio/io.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import '../model/response/kr_site_config.dart';
|
||||
import '../common/app_config.dart';
|
||||
import '../utils/kr_log_util.dart';
|
||||
import 'singbox_imp/kr_sing_box_imp.dart';
|
||||
|
||||
/// 网站配置服务
|
||||
class KRSiteConfigService extends ChangeNotifier {
|
||||
@@ -13,6 +16,22 @@ class KRSiteConfigService extends ChangeNotifier {
|
||||
_dio.options.connectTimeout = const Duration(seconds: 10);
|
||||
_dio.options.sendTimeout = const Duration(seconds: 10);
|
||||
_dio.options.receiveTimeout = const Duration(seconds: 10);
|
||||
|
||||
// 🔧 配置HttpClientAdapter使用sing-box的mixed代理
|
||||
_dio.httpClientAdapter = IOHttpClientAdapter(
|
||||
createHttpClient: () {
|
||||
final client = HttpClient();
|
||||
client.findProxy = (url) {
|
||||
final proxyConfig = KRSingBoxImp.instance.kr_buildProxyRule();
|
||||
KRLogUtil.kr_i(
|
||||
'🔍 KRSiteConfigService 请求使用代理: $proxyConfig, url: $url',
|
||||
tag: 'KRSiteConfigService',
|
||||
);
|
||||
return proxyConfig;
|
||||
};
|
||||
return client;
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
KRSiteConfig? _siteConfig;
|
||||
|
||||
@@ -97,6 +97,36 @@ class KRSingBoxImp {
|
||||
/// Stream 订阅管理器
|
||||
final List<StreamSubscription<dynamic>> _kr_subscriptions = [];
|
||||
|
||||
/// 当前混合代理端口是否就绪
|
||||
bool get kr_isProxyReady => kr_status.value is SingboxStarted;
|
||||
|
||||
String? _lastProxyRule;
|
||||
|
||||
/// 构建 Dart HttpClient 可识别的代理规则字符串
|
||||
///
|
||||
/// 当 sing-box 尚未启动时返回 `DIRECT`,启动后返回
|
||||
/// `PROXY 127.0.0.1:<port>; DIRECT`,以便在代理不可用时自动回落。
|
||||
String kr_buildProxyRule({bool includeDirectFallback = true}) {
|
||||
if (!kr_isProxyReady) {
|
||||
const directRule = 'DIRECT';
|
||||
if (_lastProxyRule != directRule) {
|
||||
KRLogUtil.kr_i('⏳ sing-box 未就绪,使用 DIRECT 直连', tag: 'SingBox');
|
||||
_lastProxyRule = directRule;
|
||||
}
|
||||
return directRule;
|
||||
}
|
||||
final proxyRule = StringBuffer('PROXY 127.0.0.1:$kr_port');
|
||||
if (includeDirectFallback) {
|
||||
proxyRule.write('; DIRECT');
|
||||
}
|
||||
final ruleString = proxyRule.toString();
|
||||
if (_lastProxyRule != ruleString) {
|
||||
KRLogUtil.kr_i('🛠️ 使用代理规则: $ruleString', tag: 'SingBox');
|
||||
_lastProxyRule = ruleString;
|
||||
}
|
||||
return ruleString;
|
||||
}
|
||||
|
||||
/// 初始化
|
||||
Future<void> init() async {
|
||||
try {
|
||||
@@ -426,8 +456,10 @@ class KRSingBoxImp {
|
||||
|
||||
kr_outbounds = outbounds;
|
||||
|
||||
final map = {};
|
||||
map["outbounds"] = kr_outbounds;
|
||||
// 只保存 outbounds,Mobile.buildConfig() 会添加其他配置
|
||||
final map = {
|
||||
"outbounds": kr_outbounds
|
||||
};
|
||||
|
||||
final file = _file(kr_configName);
|
||||
final temp = _tempFile(kr_configName);
|
||||
|
||||
Reference in New Issue
Block a user