/* * Copyright 2023 Hongen Wang All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import 'dart:async'; import 'dart:io'; import 'package:proxypin/network/bin/configuration.dart'; import 'package:proxypin/network/components/hosts.dart'; import 'package:proxypin/network/components/interceptor.dart'; import 'package:proxypin/network/components/request_block.dart'; import 'package:proxypin/network/components/request_rewrite.dart'; import 'package:proxypin/network/components/script.dart'; import 'package:proxypin/network/handle/http_proxy_handle.dart'; import 'package:proxypin/network/util/crts.dart'; import 'package:proxypin/utils/platform.dart'; import '../components/request_map.dart'; import '../http/codec.dart'; import '../channel/network.dart'; import '../util/logger.dart'; import '../util/system_proxy.dart'; import 'listener.dart'; Future main() async { var configuration = await Configuration.instance; ProxyServer(configuration).start(); } /// 代理服务器 class ProxyServer { static ProxyServer? current; //socket服务 Server? server; //请求事件监听 List listeners = []; //配置 final Configuration configuration; ProxyServer(this.configuration) { current = this; } //是否启动 bool get isRunning => server?.isRunning ?? false; ///是否启用https抓包 bool get enableSsl => configuration.enableSsl; int get port => configuration.port; set enableSsl(bool enableSsl) { configuration.enableSsl = enableSsl; if (server == null || server?.isRunning == false) { return; } if (configuration.enableSystemProxy) { SystemProxy.setSslProxyEnable(enableSsl, port); } } /// 启动代理服务 Future start() async { Server server = Server(configuration, listener: CombinedEventListener(listeners)); List interceptors = [ Hosts(), RequestMapInterceptor.instance, RequestRewriteInterceptor.instance, ScriptInterceptor(), RequestBlockInterceptor(), ]; interceptors.sort((a, b) => a.priority.compareTo(b.priority)); server.initChannel((channel) { channel.dispatcher.handle( HttpRequestCodec(), HttpResponseCodec(), HttpProxyChannelHandler(listener: CombinedEventListener(listeners), interceptors: interceptors), ); }); return server.bind(port).then((serverSocket) { logger.i("listen on $port"); this.server = server; if (configuration.enableSystemProxy) { setSystemProxyEnable(true); } //初始化证书 CertificateManager.initCAConfig(); return server; }); } /// 停止代理服务 Future stop() async { if (!isRunning) { return server; } if (configuration.enableSystemProxy) { await setSystemProxyEnable(false); } logger.i("stop on $port"); await server?.stop(); return server; } /// 设置系统代理 Future setSystemProxyEnable(bool enable) async { if (!Platforms.isDesktop()) { return; } //关闭系统代理 恢复成外部代理地址 if (!enable && configuration.externalProxy?.enabled == true) { await SystemProxy.setSystemProxy(configuration.externalProxy!.port!, enableSsl, configuration.proxyPassDomains); return; } await SystemProxy.setSystemProxyEnable(port, enable, enableSsl, passDomains: configuration.proxyPassDomains); } /// 重启代理服务 Future restart() async { await stop().whenComplete(() => start()); } ///检查是否监听端口 没有监听则启动 Future retryBind() async { try { await Socket.connect('127.0.0.1', port, timeout: const Duration(milliseconds: 350)); } catch (e) { await restart(); } } ///添加监听器 void addListener(EventListener listener) { listeners.add(listener); } }