Skip to content

Commit c31f51c

Browse files
committed
refactor: 简化代理实现,仅支持 HTTP 代理
- 移除 SOCKS5 支持以保持与 mpv 一致 - 添加 mpv http-proxy 属性设置 - 移除 flutter_socks_proxy 依赖 - 简化 proxy_utils 解析逻辑
1 parent 127d1d9 commit c31f51c

File tree

7 files changed

+51
-88
lines changed

7 files changed

+51
-88
lines changed

lib/pages/my/my_page.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ class _MyPageState extends State<MyPage> {
102102
},
103103
leading: const Icon(Icons.vpn_key_rounded),
104104
title: Text('代理设置', style: TextStyle(fontFamily: fontFamily)),
105-
description: Text('配置HTTP/SOCKS5代理', style: TextStyle(fontFamily: fontFamily)),
105+
description: Text('配置HTTP代理', style: TextStyle(fontFamily: fontFamily)),
106106
),
107107
],
108108
),

lib/pages/player/player_controller.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import 'package:kazumi/pages/video/video_controller.dart';
1313
import 'package:flutter_modular/flutter_modular.dart';
1414
import 'package:hive/hive.dart';
1515
import 'package:kazumi/utils/storage.dart';
16+
import 'package:kazumi/utils/proxy_utils.dart';
1617
import 'package:kazumi/utils/logger.dart';
1718
import 'package:kazumi/utils/utils.dart';
1819
import 'package:kazumi/utils/constants.dart';
@@ -332,6 +333,19 @@ abstract class _PlayerController with Store {
332333
}
333334
}
334335

336+
// 设置 HTTP 代理
337+
final bool proxyEnable =
338+
setting.get(SettingBoxKey.proxyEnable, defaultValue: false);
339+
if (proxyEnable) {
340+
final String proxyUrl =
341+
setting.get(SettingBoxKey.proxyUrl, defaultValue: '');
342+
final formattedProxy = ProxyUtils.getFormattedProxyUrl(proxyUrl);
343+
if (formattedProxy != null) {
344+
await pp.setProperty("http-proxy", formattedProxy);
345+
KazumiLogger().i('Player: HTTP 代理设置成功 $formattedProxy');
346+
}
347+
}
348+
335349
await mediaPlayer!.setAudioTrack(
336350
AudioTrack.auto(),
337351
);

lib/pages/settings/proxy_settings.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ class _ProxySettingsPageState extends State<ProxySettingsPage> {
6363
if (url.isNotEmpty) {
6464
final parsed = ProxyUtils.parseProxyUrl(url);
6565
if (parsed == null) {
66-
KazumiDialog.showToast(message: '代理地址格式错误,请使用如 http://127.0.0.1:7890 或 socks5://127.0.0.1:7890 的格式');
66+
KazumiDialog.showToast(message: '代理地址格式错误,请使用 http://127.0.0.1:7890 格式');
6767
return;
6868
}
6969
}
@@ -179,7 +179,7 @@ class _ProxySettingsPageState extends State<ProxySettingsPage> {
179179
},
180180
title:
181181
Text('启用代理', style: TextStyle(fontFamily: fontFamily)),
182-
description: Text('启用后所有网络请求将通过代理服务器',
182+
description: Text('启用后网络请求将通过代理服务器',
183183
style: TextStyle(fontFamily: fontFamily)),
184184
initialValue: proxyEnable,
185185
),
@@ -193,7 +193,7 @@ class _ProxySettingsPageState extends State<ProxySettingsPage> {
193193
TextField(
194194
controller: urlController,
195195
decoration: InputDecoration(
196-
hintText: 'http://127.0.0.1:7890 或 socks5://127.0.0.1:7890',
196+
hintText: 'http://127.0.0.1:7890',
197197
border: OutlineInputBorder(
198198
borderRadius: BorderRadius.circular(8),
199199
),
@@ -220,7 +220,7 @@ class _ProxySettingsPageState extends State<ProxySettingsPage> {
220220
if (proxyUrl.isNotEmpty) ...[
221221
const SizedBox(height: 4),
222222
Text(
223-
ProxyUtils.getProxyTypeHint(proxyUrl),
223+
ProxyUtils.isValidProxyUrl(proxyUrl) ? '格式正确' : '格式错误',
224224
style: TextStyle(
225225
fontFamily: fontFamily,
226226
fontSize: 12,

lib/request/request.dart

Lines changed: 22 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import 'package:kazumi/utils/storage.dart';
88
import 'package:kazumi/utils/proxy_utils.dart';
99
import 'package:kazumi/utils/logger.dart';
1010
import 'package:hive/hive.dart';
11-
import 'package:flutter_socks_proxy/socks_proxy.dart';
1211

1312
class Request {
1413
static final Request _instance = Request._internal();
@@ -33,7 +32,7 @@ class Request {
3332
dio.options.headers['user-agent'] = Utils.getRandomUA();
3433
}
3534

36-
// 设置代理
35+
// 设置代理(仅支持 HTTP 代理)
3736
static void setProxy() {
3837
final bool proxyEnable =
3938
setting.get(SettingBoxKey.proxyEnable, defaultValue: false);
@@ -55,59 +54,30 @@ class Request {
5554
return;
5655
}
5756

58-
final (proxyType, proxyHost, proxyPort) = parsed;
57+
final (proxyHost, proxyPort) = parsed;
5958

60-
if (proxyType == 'SOCKS5') {
61-
// SOCKS5 代理使用 flutter_socks_proxy 库
62-
try {
63-
// 构建代理字符串,支持认证
64-
String proxyString;
59+
dio.httpClientAdapter = IOHttpClientAdapter(
60+
createHttpClient: () {
61+
final HttpClient client = HttpClient();
62+
client.findProxy = (Uri uri) {
63+
return 'PROXY $proxyHost:$proxyPort';
64+
};
65+
// 处理代理认证
6566
if (proxyUsername.isNotEmpty && proxyPassword.isNotEmpty) {
66-
proxyString = 'SOCKS5 $proxyUsername:$proxyPassword@$proxyHost:$proxyPort';
67-
} else {
68-
proxyString = 'SOCKS5 $proxyHost:$proxyPort';
67+
client.addProxyCredentials(
68+
proxyHost,
69+
proxyPort,
70+
'Basic',
71+
HttpClientBasicCredentials(proxyUsername, proxyPassword),
72+
);
6973
}
70-
71-
dio.httpClientAdapter = IOHttpClientAdapter(
72-
createHttpClient: () {
73-
final HttpClient client = createProxyHttpClient();
74-
// 设置代理
75-
client.findProxy = (url) => proxyString;
76-
// 忽略证书验证
77-
client.badCertificateCallback =
78-
(X509Certificate cert, String host, int port) => true;
79-
return client;
80-
},
81-
);
82-
KazumiLogger().i('Proxy: SOCKS5 代理设置成功 $proxyHost:$proxyPort');
83-
} catch (e) {
84-
KazumiLogger().e('Proxy: SOCKS5 代理设置失败', error: e);
85-
}
86-
} else if (proxyType == 'HTTP') {
87-
// HTTP 代理
88-
dio.httpClientAdapter = IOHttpClientAdapter(
89-
createHttpClient: () {
90-
final HttpClient client = HttpClient();
91-
client.findProxy = (Uri uri) {
92-
return 'PROXY $proxyHost:$proxyPort';
93-
};
94-
// 处理代理认证
95-
if (proxyUsername.isNotEmpty && proxyPassword.isNotEmpty) {
96-
client.addProxyCredentials(
97-
proxyHost,
98-
proxyPort,
99-
'Basic',
100-
HttpClientBasicCredentials(proxyUsername, proxyPassword),
101-
);
102-
}
103-
// 忽略证书验证
104-
client.badCertificateCallback =
105-
(X509Certificate cert, String host, int port) => true;
106-
return client;
107-
},
108-
);
109-
KazumiLogger().i('Proxy: HTTP 代理设置成功 $proxyHost:$proxyPort');
110-
}
74+
// 忽略证书验证
75+
client.badCertificateCallback =
76+
(X509Certificate cert, String host, int port) => true;
77+
return client;
78+
},
79+
);
80+
KazumiLogger().i('Proxy: HTTP 代理设置成功 $proxyHost:$proxyPort');
11181
}
11282

11383
// 禁用代理

lib/utils/proxy_utils.dart

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,21 @@ class ProxyUtils {
33
// 防止实例化
44
ProxyUtils._();
55

6-
/// 解析代理 URL,返回 (协议, 主机, 端口)
6+
/// 解析代理 URL,返回 (主机, 端口)
77
///
88
/// 支持的格式:
99
/// - http://127.0.0.1:7890
10-
/// - https://127.0.0.1:7890
11-
/// - socks5://127.0.0.1:7890
12-
/// - socks://127.0.0.1:7890
13-
/// - 127.0.0.1:7890 (默认 HTTP)
14-
static (String, String, int)? parseProxyUrl(String url) {
10+
/// - 127.0.0.1:7890
11+
static (String, int)? parseProxyUrl(String url) {
1512
url = url.trim();
1613
if (url.isEmpty) return null;
1714

18-
String protocol = 'HTTP';
1915
String hostPort = url;
2016

17+
// 移除 http:// 前缀
2118
if (url.toLowerCase().startsWith('http://')) {
22-
protocol = 'HTTP';
2319
hostPort = url.substring(7);
2420
} else if (url.toLowerCase().startsWith('https://')) {
25-
protocol = 'HTTP';
26-
hostPort = url.substring(8);
27-
} else if (url.toLowerCase().startsWith('socks5://')) {
28-
protocol = 'SOCKS5';
29-
hostPort = url.substring(9);
30-
} else if (url.toLowerCase().startsWith('socks://')) {
31-
protocol = 'SOCKS5';
3221
hostPort = url.substring(8);
3322
}
3423

@@ -40,15 +29,14 @@ class ProxyUtils {
4029
final port = int.tryParse(parts[1]);
4130
if (host.isEmpty || port == null) return null;
4231

43-
return (protocol, host, port);
32+
return (host, port);
4433
}
4534

46-
/// 获取代理类型的显示文本
47-
static String getProxyTypeHint(String proxyUrl) {
48-
if (proxyUrl.isEmpty) return '';
49-
final parsed = parseProxyUrl(proxyUrl);
50-
if (parsed == null) return '格式错误';
51-
return '${parsed.$1} 代理';
35+
/// 获取格式化的代理 URL(用于 mpv)
36+
static String? getFormattedProxyUrl(String url) {
37+
final parsed = parseProxyUrl(url);
38+
if (parsed == null) return null;
39+
return 'http://${parsed.$1}:${parsed.$2}';
5240
}
5341

5442
/// 验证代理 URL 是否有效

pubspec.lock

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -556,14 +556,6 @@ packages:
556556
url: "https://pub.dev"
557557
source: hosted
558558
version: "4.0.1"
559-
flutter_socks_proxy:
560-
dependency: "direct main"
561-
description:
562-
name: flutter_socks_proxy
563-
sha256: "5603ad90c2849d2e6f2b4ed3d337653b3a6c8fb471f535e3715254913a9206ce"
564-
url: "https://pub.dev"
565-
source: hosted
566-
version: "0.0.3"
567559
flutter_svg:
568560
dependency: "direct main"
569561
description:

pubspec.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ dependencies:
8888
flutter_inappwebview_android: ^1.1.3
8989
upgrader: ^11.4.0
9090
open_filex: ^4.7.0
91-
flutter_socks_proxy: ^0.0.3
9291
html: any
9392
material_color_utilities: any
9493
path: any

0 commit comments

Comments
 (0)