diff --git a/pom.xml b/pom.xml index 1bbac05..a3d32ef 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ top.octopusyan YanFrp - 0.1.2-SNAPSHOT + 1.0.3-SNAPSHOT YanFrp diff --git a/src/main/java/top/octopusyan/YanFrpApplication.java b/src/main/java/top/octopusyan/YanFrpApplication.java index a046cee..6c30d0b 100644 --- a/src/main/java/top/octopusyan/YanFrpApplication.java +++ b/src/main/java/top/octopusyan/YanFrpApplication.java @@ -10,7 +10,7 @@ import javafx.stage.Stage; import javafx.stage.StageStyle; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import top.octopusyan.base.BaseController; +import top.octopusyan.controller.LoginController; import top.octopusyan.http.OkHttpClientConfig; import top.octopusyan.manager.FrpManager; import top.octopusyan.manager.http.HttpConfig; @@ -21,6 +21,8 @@ import top.octopusyan.utils.AlertUtil; import top.octopusyan.utils.EncryptionUtil; import top.octopusyan.utils.FxmlUtil; +import java.util.Objects; + /** * @author : octopus yan * @email : octopus_yan@foxmail.com @@ -84,11 +86,11 @@ public class YanFrpApplication extends Application { root.getPrefHeight() + 20, Color.TRANSPARENT ); - scene.getStylesheets().addAll(getClass().getResource("/css/root.css").toExternalForm()); + scene.getStylesheets().addAll(Objects.requireNonNull(getClass().getResource("/css/root.css")).toExternalForm()); stage.setScene(scene); stage.show(); - BaseController controller = fxmlLoader.getController(); + LoginController controller = fxmlLoader.getController(); controller.setApplication(this); } catch (Throwable t) { diff --git a/src/main/java/top/octopusyan/controller/MainController.java b/src/main/java/top/octopusyan/controller/MainController.java index 33af128..5af8725 100644 --- a/src/main/java/top/octopusyan/controller/MainController.java +++ b/src/main/java/top/octopusyan/controller/MainController.java @@ -52,7 +52,6 @@ public class MainController extends BaseController implements Initial public static final String PROXY_LIST_ITEM_RUN_CLASS = "proxyListItem-run"; public static final String PROXY_LIST_ITEM_CLOSE_CLASS = "proxyListItem-close"; public static final String PROXY_LIST_ITEM_SELECT_CLASS = "proxyListItem-select"; - public static final String INPUT_CLASS = "inputText"; @FXML public StackPane root; @@ -93,12 +92,13 @@ public class MainController extends BaseController implements Initial @FXML public JFXButton logoutBtn; - private ToggleGroup openProxyGroup = new ToggleGroup(); - private SimpleBooleanProperty customizeDomain = new SimpleBooleanProperty(false); - private Map frpUtilMap = new HashMap<>(); + private final ToggleGroup openProxyGroup = new ToggleGroup(); + private final SimpleBooleanProperty customizeDomain = new SimpleBooleanProperty(false); + private final Map frpUtilMap = new HashMap<>(); + private final Map userProxy = new HashMap<>(); private ProxySetupModel proxySetupModel; private ProxySetup proxySetup; - private SimpleBooleanProperty setup = new SimpleBooleanProperty(false); + private final SimpleBooleanProperty setup = new SimpleBooleanProperty(false); @Override public boolean dragWindow() { @@ -156,6 +156,20 @@ public class MainController extends BaseController implements Initial // 如果用户隧道列表不为空 if (result != null && result.size() > 0) { + + // 上次关闭时选择的隧道 + if (selectProxyName != null) + for (int i = 0; i < result.size(); i++) { + if (result.get(i).getProxy_name().equals(selectProxyName)) + selectProxy(i); + selectProxyName = null; + } + + // 保存用户隧道信息 + for (ProxySetup setup : result) { + userProxy.put(setup.getId(), setup); + } + proxySetup = result.get(selectProxy()); proxySetupModel.set(result.get(selectProxy())); // 初始化用户隧道列表 @@ -163,10 +177,7 @@ public class MainController extends BaseController implements Initial // 重置隧道列表视图 initProxyListView(); } -// else { -// } -// -// bindDataView(); + }); } @@ -264,8 +275,7 @@ public class MainController extends BaseController implements Initial // 是否切换为自定义域名 if (newValue) { // 隐藏系统域名 - if (parent.getChildren().contains(domainSuffixTextField)) - parent.getChildren().remove(domainSuffixTextField); + parent.getChildren().remove(domainSuffixTextField); // 用户域名是否自定义 if (!DomainUtil.isCustomize(proxySetupModel.get())) { proxySetupModel.setDomain(""); @@ -298,7 +308,9 @@ public class MainController extends BaseController implements Initial tabPane.getSelectionModel().select(1); } - /** 设置访问链接 */ + /** + * 设置访问链接 + */ private void setDomainLink() { // 外网访问连接 if (DomainUtil.isHttp(proxySetupModel)) { @@ -315,15 +327,16 @@ public class MainController extends BaseController implements Initial public void initViewAction() { // 重置 resetProxyBtn.setOnMouseClicked(event -> { - proxySetup.setRuning(false); + proxySetup = userProxy.get(proxySetup.getId()); + proxySetup.setRuning(proxySetupModel.isRunning()); proxySetupModel.set(proxySetup); domainTextField.resetValidation(); }); // 日志清理 clearLogBtn.setOnMouseClicked(event -> { - if (frpUtilMap.get(proxySetupModel.getProxyName()) != null) - frpUtilMap.get(proxySetupModel.getProxyName()).clearLog(); + if (frpUtilMap.get(proxySetup.getId()) != null) + frpUtilMap.get(proxySetup.getId()).clearLog(); }); // 更换服务器地址 @@ -356,16 +369,12 @@ public class MainController extends BaseController implements Initial // 本地IP检查 localHostTextField.getValidators().add(TextValidate.IpRequired); localHostTextField.getValidators().add(TextValidate.IpFormat); - localHostTextField.textProperty().addListener((observable, oldValue, newValue) -> { - localHostTextField.validate(); - }); + localHostTextField.textProperty().addListener((observable, oldValue, newValue) -> localHostTextField.validate()); // 端口检查 localPortTextField.getValidators().add(TextValidate.PortRequired); localPortTextField.getValidators().add(TextValidate.PortFormat); - localPortTextField.textProperty().addListener((observable, oldValue, newValue) -> { - localPortTextField.validate(); - }); + localPortTextField.textProperty().addListener((observable, oldValue, newValue) -> localPortTextField.validate()); // 域名检查 setup.addListener((observable, oldValue, newValue) -> { @@ -403,7 +412,7 @@ public class MainController extends BaseController implements Initial Platform.runLater(() -> { setup.set(false); proxySetupModel.set(proxySetup); - FrpManager frpManager = frpUtilMap.get(proxySetup.getProxy_name()); + FrpManager frpManager = frpUtilMap.get(proxySetup.getId()); proxyLogPane.contentProperty().set(frpManager == null ? null : frpManager.getConsole()); setup.set(true); setDomainLink(); @@ -430,9 +439,7 @@ public class MainController extends BaseController implements Initial }); // 链接跳转 - domainLink.setOnMouseClicked(event -> { - getApplication().getHostServices().showDocument(domainLink.getText()); - }); + domainLink.setOnMouseClicked(event -> getApplication().getHostServices().showDocument(domainLink.getText())); // 复制外网访问地址 copyDomainBtn.setOnMouseClicked(event -> { @@ -448,7 +455,7 @@ public class MainController extends BaseController implements Initial // 退出登录 logoutBtn.setOnMouseClicked(event -> { - for (String key : frpUtilMap.keySet()) { + for (Integer key : frpUtilMap.keySet()) { frpUtilMap.get(key).stop(); } ApplicatonStore.logout(); @@ -516,16 +523,15 @@ public class MainController extends BaseController implements Initial } catch (IOException e) { e.printStackTrace(); } - - proxyListView.getSelectionModel().select(items.size() - 1); } /** * 启动代理 */ private void startProxy() { + // 验证 - if(!domainTextField.validate() || !localHostTextField.validate() || !localPortTextField.validate()) + if (!domainTextField.validate() || !localHostTextField.validate() || !localPortTextField.validate()) return; // 非 http 隧道系统随机分配端口 @@ -533,45 +539,37 @@ public class MainController extends BaseController implements Initial proxySetupModel.setRemotePort(String.valueOf(ProxyManager.randomPort())); } - // 是用户隧道 - if (proxySetupModel.getId() != null && !proxySetupModel.get().equals(proxySetup)) { - // 删除旧隧道 - ProxyManager.delete(Integer.parseInt(proxySetupModel.getId())); - + // 是否有修改 + if (!proxySetupModel.get().equals(userProxy.get(proxySetup.getId()))) { // 添加隧道 ProxyManager.add(new OnHttpListener() { @Override public void onSucceed(ProxySetup result) { - result.setRuning(frpUtilMap.containsKey(result.getProxy_name())); - proxySetupModel.set(result); + // 如果添加成功 + if (result != null) { + userProxy.put(result.getId(), result); + start(result); + } } @Override public void onFail(Exception e) { - - } - }, proxySetupModel.get()); - } else if(proxySetupModel.getId() == null) { - - // 添加隧道 - ProxyManager.add(new OnHttpListener() { - @Override - public void onSucceed(ProxySetup result) { - result.setRuning(frpUtilMap.containsKey(result.getProxy_name())); - proxySetupModel.set(result); - } - - @Override - public void onFail(Exception e) { - } }, proxySetupModel.get()); + } else { + start(proxySetup); } + } + + private void start(ProxySetup setup) { + // 添加成功,设置运行状态 + setup.setRuning(frpUtilMap.containsKey(setup.getId())); + proxySetupModel.set(setup); // 初始化frputil FrpManager frpManager; - if ((frpManager = frpUtilMap.get(proxySetupModel.getProxyName())) == null) - frpUtilMap.put(proxySetupModel.getProxyName(), frpManager = FrpManager.init(proxySetupModel)); + if ((frpManager = frpUtilMap.get(setup.getId())) == null) + frpUtilMap.put(proxySetup.getId(), frpManager = FrpManager.init(proxySetupModel)); // 设置文本域对象 if (proxyLogPane.getContent() == null) proxyLogPane.contentProperty().set(frpManager.getConsole()); @@ -588,7 +586,7 @@ public class MainController extends BaseController implements Initial */ private void stopProxy() { // 关闭CMD - FrpManager frpManager = frpUtilMap.get(proxySetupModel.getProxyName()); + FrpManager frpManager = frpUtilMap.get(proxySetup.getId()); if (frpManager != null) frpManager.stop(); } diff --git a/src/main/java/top/octopusyan/http/Api.java b/src/main/java/top/octopusyan/http/Api.java index 4b2d7c5..8428905 100644 --- a/src/main/java/top/octopusyan/http/Api.java +++ b/src/main/java/top/octopusyan/http/Api.java @@ -1,12 +1,12 @@ package top.octopusyan.http; import top.octopusyan.http.request.*; +import top.octopusyan.manager.ProxyManager; import top.octopusyan.manager.http.api.NotParamApi; import top.octopusyan.manager.http.api.ParamApi; import top.octopusyan.manager.http.api.PathParamApi; import top.octopusyan.manager.http.config.BodyType; import top.octopusyan.manager.http.config.HttpConstant; -import top.octopusyan.manager.ProxyManager; /** * @author : octopus yan diff --git a/src/main/java/top/octopusyan/http/OkHttpClientConfig.java b/src/main/java/top/octopusyan/http/OkHttpClientConfig.java index 557d93d..abf288c 100644 --- a/src/main/java/top/octopusyan/http/OkHttpClientConfig.java +++ b/src/main/java/top/octopusyan/http/OkHttpClientConfig.java @@ -32,29 +32,27 @@ public class OkHttpClientConfig { public static final HashMap> cookieStore = new HashMap<>(); public static OkHttpClient httpClient() { - Interceptor tokenInterceptor = new Interceptor() {//全局拦截器,往请求头部添加 token 字段,实现全局添加 token - @Override - public Response intercept(Chain chain) throws IOException {// 打印请求报文 - // 获取请求 - Request request = chain.request(); - // 取出请求参数 - String reqBody = getRequestBody(request); + //全局拦截器,往请求头部添加 token 字段,实现全局添加 token + Interceptor tokenInterceptor = chain -> {// 打印请求报文 + // 获取请求 + Request request = chain.request(); + // 取出请求参数 + String reqBody = getRequestBody(request); - // 打印请求报文 - log.info("【" + TAG + "】 " + String.format("发送新请求\n-\tmethod:%s\n-\turl:%s\n-\theaders: %s\n-\tbody:%s", - request.method(), request.url(), request.headers(), reqBody)); - // 执行请求,获取响应报文 - Response response = chain.proceed(request); - // 获取响应内容 TODO 读取结果乱码 - String respBody = getResponseBody(response); - // 打印响应报文 + // 打印请求报文 + log.info("【" + TAG + "】 " + String.format("发送新请求\n-\tmethod:%s\n-\turl:%s\n-\theaders: %s\n-\tbody:%s", + request.method(), request.url(), request.headers(), reqBody)); + // 执行请求,获取响应报文 + Response response = chain.proceed(request); + // 获取响应内容 TODO 读取结果乱码 + String respBody = getResponseBody(response); + // 打印响应报文 // log.info("【" + TAG + "】 " + String.format("收到响应 %s %s\n-\t请求url:%s\n-\t请求body:%s\n-\t响应body:%s", // response.code(), response.message(), response.request().url(), reqBody, respBody)); - log.info("【" + TAG + "】 " + String.format("收到响应 %s %s\n-\t请求url:%s\n-\t请求body:%s", - response.code(), response.message(), response.request().url(), reqBody)); + log.info("【" + TAG + "】 " + String.format("收到响应 %s %s\n-\t请求url:%s\n-\t请求body:%s", + response.code(), response.message(), response.request().url(), reqBody)); - return response; - } + return response; }; Dispatcher dispatcher = new Dispatcher(); @@ -93,6 +91,7 @@ public class OkHttpClientConfig { if (contentType != null) { charset = contentType.charset(StandardCharsets.UTF_8); } + assert charset != null; reqBody = buffer.readString(charset); } @@ -116,6 +115,7 @@ public class OkHttpClientConfig { charset = contentType.charset(charset); //获取Response的body的字符串 并打印 + assert charset != null; respBody = buffer.clone().readString(charset); } @@ -133,7 +133,7 @@ public class OkHttpClientConfig { @Override public List loadForRequest(@NotNull HttpUrl httpUrl) { List cookies = cookieStore.get(httpUrl.host()); - return cookies != null ? cookies : new ArrayList(); + return cookies != null ? cookies : new ArrayList<>(); } }; } diff --git a/src/main/java/top/octopusyan/manager/FrpManager.java b/src/main/java/top/octopusyan/manager/FrpManager.java index 5a40094..77a3de2 100644 --- a/src/main/java/top/octopusyan/manager/FrpManager.java +++ b/src/main/java/top/octopusyan/manager/FrpManager.java @@ -3,14 +3,19 @@ package top.octopusyan.manager; import javafx.application.Platform; import javafx.scene.control.TextArea; import lombok.Data; +import lombok.EqualsAndHashCode; import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import top.octopusyan.http.Api; +import top.octopusyan.manager.http.EasyHttp; +import top.octopusyan.manager.http.model.ResponseClass; import top.octopusyan.model.ApplicatonStore; import top.octopusyan.model.ProxySetupModel; +import top.octopusyan.utils.JsoupUtil; import java.io.*; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @author : octopus yan @@ -24,6 +29,7 @@ public class FrpManager { public static final String FRPC_CLIENT_FILE_NAME = "frpclienttmpfile.exe"; private final String FRPC_CONF_PREFIX_NAME = "proxy_"; private final String FRPC_CONF_SUFFIX_NAME = ".ini"; + private static final Map serverConfigraution = new HashMap<>(3); /** * 应用临时目录 地址 */ @@ -65,6 +71,7 @@ public class FrpManager { */ public void start() { thread = new ProxyThread(); + thread.setName(FRPC_CONF_PREFIX_NAME + model.getSort()); thread.start(); } @@ -98,14 +105,14 @@ public class FrpManager { */ public void clearLog() { if (console != null) - Platform.runLater(() -> console.clear()); + Platform.runLater(console::clear); } /** * 隧道配置文件地址 */ private String getConfigFilePath() { - return YAN_FRP_TEMP_DIR_PATH + File.separator + FRPC_CONF_PREFIX_NAME + model.getProxyName() + FRPC_CONF_SUFFIX_NAME; + return YAN_FRP_TEMP_DIR_PATH + File.separator + FRPC_CONF_PREFIX_NAME + model.getSort() + FRPC_CONF_SUFFIX_NAME; } /** @@ -121,11 +128,62 @@ public class FrpManager { frpcConfigFile.deleteOnExit(); // 写入服务配置 - FileUtils.write(frpcConfigFile, ProxyManager.getUserServerConfig(model.get().getNode()), StandardCharsets.UTF_8); + FileUtils.write(frpcConfigFile, getUserFrpServerConfig(model.get().getNode()), StandardCharsets.UTF_8); // 写入隧道配置 - FileUtils.write(frpcConfigFile, ProxyManager.getProxyConfig(model), StandardCharsets.UTF_8, true); + FileUtils.write(frpcConfigFile, getProxyFrpConfig(model), StandardCharsets.UTF_8, true); } + + public static String getUserFrpServerConfig(int node) { + String config = serverConfigraution.get(node); + if (StringUtils.isNotEmpty(config)) return config; + try { + String result = EasyHttp.builder() + .api(Api.getServerConfiguration(node)) + .pathParam(String.valueOf(node)) + .execute(new ResponseClass() { + }); + config = JsoupUtil.getServerConfiguration(result); + if (StringUtils.isNotEmpty(config)) serverConfigraution.put(node, config); + return config; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public static String getProxyFrpConfig(ProxySetupModel setup) { + String n = "\n"; + // 基础配置 + StringBuilder stringBuilder = new StringBuilder("[" + ApplicatonStore.getAccount() + "_" + setup.getSort() + "]\n"); + stringBuilder.append("privilege_mode = true\n") + .append("type = ").append(setup.getProxyType().contains("http") ? "http" : setup.getProxyType()).append(n) + .append("local_ip = ").append(setup.getLocalIp()).append(n) + .append("local_port = ").append(setup.getLocalPort()).append(n).append(n); + + if ("http".equals(setup.getProxyType()) || "https".equals(setup.getProxyType())) { + // HTTP / HTTPS + stringBuilder.append("custom_domains = ").append(setup.getDomain()).append(setup.getDomainSuffix()).append(n); + if (!StringUtils.isEmpty(setup.getLocations())) + stringBuilder.append("locations = ").append(setup.getLocations()).append(n); + if (!StringUtils.isEmpty(setup.getLocations())) + stringBuilder.append("host_header_rewrite = ").append(setup.getHostHeaderRewrite()).append(n); + if (!StringUtils.isEmpty(setup.getLocations())) + stringBuilder.append("header_X-From-Where = ").append(setup.getHeader_X_From_Where()).append(n); + } else { + // TCP / UDP / XTCP / STCP + stringBuilder.append("remote_port = ").append(setup.getRemotePort()).append(n); + if (!StringUtils.isEmpty(setup.getSk())) + stringBuilder.append("sk = ").append(setup.getSk()).append(n); + } + // 压缩和加密 + stringBuilder.append("use_encryption = ").append(setup.isUseEncryption()).append(n) + .append("use_compression = ").append(setup.isUseCompression()).append(n).append(n); + + return stringBuilder.toString(); + } + + /** * 初始化frpc客户端文件 */ @@ -135,7 +193,7 @@ public class FrpManager { frpc.createNewFile(); // 复制 frpc - copyFileUsingFileStreams(FrpManager.class.getResourceAsStream("/static/frpc.exe"), frpc); + copyFileUsingFileStreams(Objects.requireNonNull(FrpManager.class.getResourceAsStream("/static/frpc.exe"))); } // frpc 临时配置文件 @@ -154,7 +212,7 @@ public class FrpManager { try { FileUtils.deleteDirectory(frpconfigDir); - for (File file : FileUtils.getTempDirectory().listFiles()) { + for (File file : Objects.requireNonNull(FileUtils.getTempDirectory().listFiles())) { if (file.getPath().contains(YAN_FRP_TEMP_DIR_NAME) && file.canWrite() && file.isDirectory()) { FileUtils.deleteDirectory(file); } @@ -171,11 +229,11 @@ public class FrpManager { } } - private static void copyFileUsingFileStreams(InputStream input, File dest) + private static void copyFileUsingFileStreams(InputStream input) throws IOException { OutputStream output = null; try { - output = new FileOutputStream(dest); + output = new FileOutputStream(FrpManager.frpc); byte[] buf = new byte[1024]; int bytesRead; while ((bytesRead = input.read(buf)) > 0) { @@ -183,12 +241,13 @@ public class FrpManager { } } finally { input.close(); - output.close(); + if (output != null) output.close(); } } + @EqualsAndHashCode(callSuper = true) @Data - class ProxyThread extends Thread{ + class ProxyThread extends Thread { private volatile boolean exit = false; @Override @@ -216,13 +275,13 @@ public class FrpManager { String line; while ((line = readStdout.readLine()) != null && !exit) { String finalLine = line; - System.out.println("yan-frp-info:" + line); - Platform.runLater(() -> console.appendText("yan-frp-info:" + finalLine + "\n")); + System.out.println(line); + Platform.runLater(() -> console.appendText(finalLine + "\n")); } } catch (IOException e) { e.printStackTrace(); - // + // TODO 报错 Platform.runLater(() -> console.appendText("yan-frp-error:" + e.getMessage() + "\n")); Platform.runLater(() -> console.appendText("yan-frp-error:启动失败\n")); } diff --git a/src/main/java/top/octopusyan/manager/ProxyManager.java b/src/main/java/top/octopusyan/manager/ProxyManager.java index 8b2dcd9..140c382 100644 --- a/src/main/java/top/octopusyan/manager/ProxyManager.java +++ b/src/main/java/top/octopusyan/manager/ProxyManager.java @@ -13,14 +13,9 @@ import top.octopusyan.http.request.ProxySetup; import top.octopusyan.manager.http.EasyHttp; import top.octopusyan.manager.http.listener.OnHttpListener; import top.octopusyan.manager.http.model.ResponseClass; -import top.octopusyan.model.ApplicatonStore; -import top.octopusyan.model.ProxySetupModel; import top.octopusyan.utils.AlertUtil; -import top.octopusyan.utils.JsoupUtil; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; @@ -32,7 +27,6 @@ import java.util.stream.Collectors; */ public class ProxyManager { private static String csrf; - private static Map serverConfigraution = new HashMap<>(3); /** * 初始化隧道设置 @@ -170,6 +164,14 @@ public class ProxyManager { .request(new OnHttpListener() { @Override public void onSucceed(String result) { + + // 不成功 + if(!result.contains("成功")){ + Platform.runLater(() -> AlertUtil.error(result).header(null).show()); + listener.onSucceed(null); + return; + } + getList(new OnHttpListener>() { @Override public void onSucceed(List result) { @@ -181,7 +183,9 @@ public class ProxyManager { return; } } + listener.onSucceed(null); } + listener.onSucceed(null); } @Override @@ -207,53 +211,4 @@ public class ProxyManager { int i1 = htmlStr.indexOf("\"", i + 18); ProxyManager.csrf = htmlStr.substring(i + 18, i1); } - - public static String getUserServerConfig(int node) { - String config = serverConfigraution.get(node); - if (StringUtils.isNotEmpty(config)) return config; - try { - String result = EasyHttp.builder() - .api(Api.getServerConfiguration(node)) - .pathParam(String.valueOf(node)) - .execute(new ResponseClass() { - }); - config = JsoupUtil.getServerConfiguration(result); - if (StringUtils.isNotEmpty(config)) serverConfigraution.put(node, config); - return config; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - public static String getProxyConfig(ProxySetupModel setup) { - String n = "\n"; - // 基础配置 - StringBuilder stringBuilder = new StringBuilder("[" + ApplicatonStore.getAccount() + "_" + setup.getProxyName() + "]\n"); - stringBuilder.append("privilege_mode = true\n") - .append("type = ").append(setup.getProxyType().contains("http") ? "http" : setup.getProxyType()).append(n) - .append("local_ip = ").append(setup.getLocalIp()).append(n) - .append("local_port = ").append(setup.getLocalPort()).append(n).append(n); - - if ("http".equals(setup.getProxyType()) || "https".equals(setup.getProxyType())) { - // HTTP / HTTPS - stringBuilder.append("custom_domains = ").append(setup.getDomain()).append(setup.getDomainSuffix()).append(n); - if (!StringUtils.isEmpty(setup.getLocations())) - stringBuilder.append("locations = ").append(setup.getLocations()).append(n); - if (!StringUtils.isEmpty(setup.getLocations())) - stringBuilder.append("host_header_rewrite = ").append(setup.getHostHeaderRewrite()).append(n); - if (!StringUtils.isEmpty(setup.getLocations())) - stringBuilder.append("header_X-From-Where = ").append(setup.getHeader_X_From_Where()).append(n); - } else { - // TCP / UDP / XTCP / STCP - stringBuilder.append("remote_port = ").append(setup.getRemotePort()).append(n); - if (!StringUtils.isEmpty(setup.getSk())) - stringBuilder.append("sk = ").append(setup.getSk()).append(n); - } - // 压缩和加密 - stringBuilder.append("use_encryption = ").append(setup.isUseEncryption()).append(n) - .append("use_compression = ").append(setup.isUseCompression()).append(n).append(n); - - return stringBuilder.toString(); - } } diff --git a/src/main/java/top/octopusyan/manager/http/EasyHttp.java b/src/main/java/top/octopusyan/manager/http/EasyHttp.java index 3d0b217..ecc5700 100644 --- a/src/main/java/top/octopusyan/manager/http/EasyHttp.java +++ b/src/main/java/top/octopusyan/manager/http/EasyHttp.java @@ -9,15 +9,11 @@ import top.octopusyan.manager.http.api.ParamApi; import top.octopusyan.manager.http.api.PathParamApi; import top.octopusyan.manager.http.api.RequestApi; import top.octopusyan.manager.http.callback.NormalCallback; -import top.octopusyan.manager.http.listener.OnHttpListener; -import top.octopusyan.manager.http.model.CallProxy; -import top.octopusyan.manager.http.model.HttpHeaders; -import top.octopusyan.manager.http.model.HttpParams; -import top.octopusyan.manager.http.model.JsonBody; import top.octopusyan.manager.http.config.BodyType; import top.octopusyan.manager.http.config.HttpConstant; +import top.octopusyan.manager.http.listener.OnHttpListener; +import top.octopusyan.manager.http.model.*; import top.octopusyan.manager.http.request.IRequestHandler; -import top.octopusyan.manager.http.model.ResponseClass; import java.io.File; import java.io.InputStream; @@ -195,7 +191,7 @@ public class EasyHttp { try { mCallProxy = new CallProxy(createCall()); Response response = mCallProxy.execute(); - return (Result) mHandler.requestSucceed(getRequestApi(), response, mHandler.getType(responseClass)); + return mHandler.requestSucceed(getRequestApi(), response, mHandler.getType(responseClass)); } catch (Exception e) { throw mHandler.requestFail(getRequestApi(), e); } diff --git a/src/main/java/top/octopusyan/manager/http/EasyUtils.java b/src/main/java/top/octopusyan/manager/http/EasyUtils.java index 493e1c6..402c54d 100644 --- a/src/main/java/top/octopusyan/manager/http/EasyUtils.java +++ b/src/main/java/top/octopusyan/manager/http/EasyUtils.java @@ -7,11 +7,11 @@ import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.RequestBody; import org.apache.commons.lang3.StringUtils; +import top.octopusyan.manager.ThreadPoolManager; import top.octopusyan.manager.http.annotation.HttpIgnore; import top.octopusyan.manager.http.annotation.HttpRename; import top.octopusyan.manager.http.config.ContentType; import top.octopusyan.manager.http.model.UpdateBody; -import top.octopusyan.manager.ThreadPoolManager; import java.io.*; import java.lang.reflect.Field; diff --git a/src/main/java/top/octopusyan/manager/http/HttpConfig.java b/src/main/java/top/octopusyan/manager/http/HttpConfig.java index d685743..a7b8da2 100644 --- a/src/main/java/top/octopusyan/manager/http/HttpConfig.java +++ b/src/main/java/top/octopusyan/manager/http/HttpConfig.java @@ -1,6 +1,6 @@ package top.octopusyan.manager.http; -import okhttp3.*; +import okhttp3.OkHttpClient; import top.octopusyan.manager.http.config.ILogStrategy; import top.octopusyan.manager.http.request.IRequestHandler; @@ -47,11 +47,11 @@ public class HttpConfig { private HttpConfig(OkHttpClient client) { mClient = client; - mParams = new HashMap(); + mParams = new HashMap<>(); mHeaders = new HashMap<>(); } private HttpConfig() { - mParams = new HashMap(); + mParams = new HashMap<>(); mHeaders = new HashMap<>(); initHttpClient(); } @@ -81,7 +81,7 @@ public class HttpConfig { public HttpConfig setParams(HashMap params) { if (params == null) { - params = new HashMap(); + params = new HashMap<>(); } mParams = params; return this; @@ -207,6 +207,6 @@ public class HttpConfig { } private void initHttpClient() { - ; + } } diff --git a/src/main/java/top/octopusyan/manager/http/callback/BaseCallback.java b/src/main/java/top/octopusyan/manager/http/callback/BaseCallback.java index e802dc5..5fd7e47 100644 --- a/src/main/java/top/octopusyan/manager/http/callback/BaseCallback.java +++ b/src/main/java/top/octopusyan/manager/http/callback/BaseCallback.java @@ -3,10 +3,11 @@ package top.octopusyan.manager.http.callback; import okhttp3.Call; import okhttp3.Callback; import okhttp3.Response; +import org.jetbrains.annotations.NotNull; +import top.octopusyan.manager.http.EasyUtils; import top.octopusyan.manager.http.HttpConfig; import top.octopusyan.manager.http.HttpLog; import top.octopusyan.manager.http.model.CallProxy; -import top.octopusyan.manager.http.EasyUtils; import java.io.IOException; import java.net.SocketTimeoutException; @@ -34,7 +35,7 @@ public abstract class BaseCallback implements Callback { } @Override - public void onResponse(Call call, Response response) { + public void onResponse(@NotNull Call call, @NotNull Response response) { try { // 收到响应 onResponse(response); @@ -48,7 +49,7 @@ public abstract class BaseCallback implements Callback { } @Override - public void onFailure(Call call, IOException e) { + public void onFailure(@NotNull Call call, @NotNull IOException e) { // 服务器请求超时重试 if (e instanceof SocketTimeoutException && mRetryCount < HttpConfig.getInstance().getRetryCount()) { // 设置延迟 N 秒后重试该请求 diff --git a/src/main/java/top/octopusyan/manager/http/callback/NormalCallback.java b/src/main/java/top/octopusyan/manager/http/callback/NormalCallback.java index 5d15d8b..02c4f55 100644 --- a/src/main/java/top/octopusyan/manager/http/callback/NormalCallback.java +++ b/src/main/java/top/octopusyan/manager/http/callback/NormalCallback.java @@ -2,12 +2,12 @@ package top.octopusyan.manager.http.callback; import javafx.application.Platform; import okhttp3.Response; -import top.octopusyan.manager.http.listener.OnHttpListener; -import top.octopusyan.manager.http.HttpLog; -import top.octopusyan.manager.http.model.CallProxy; -import top.octopusyan.manager.http.api.RequestApi; -import top.octopusyan.manager.http.request.IRequestHandler; import top.octopusyan.manager.http.EasyUtils; +import top.octopusyan.manager.http.HttpLog; +import top.octopusyan.manager.http.api.RequestApi; +import top.octopusyan.manager.http.listener.OnHttpListener; +import top.octopusyan.manager.http.model.CallProxy; +import top.octopusyan.manager.http.request.IRequestHandler; /** * @author : octopus yan diff --git a/src/main/java/top/octopusyan/manager/http/config/LogStrategy.java b/src/main/java/top/octopusyan/manager/http/config/LogStrategy.java index 4281598..9cc61d4 100644 --- a/src/main/java/top/octopusyan/manager/http/config/LogStrategy.java +++ b/src/main/java/top/octopusyan/manager/http/config/LogStrategy.java @@ -1,8 +1,8 @@ package top.octopusyan.manager.http.config; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.commons.lang3.StringUtils; import top.octopusyan.manager.http.EasyHttp; import top.octopusyan.manager.http.HttpConfig; diff --git a/src/main/java/top/octopusyan/manager/http/model/UpdateBody.java b/src/main/java/top/octopusyan/manager/http/model/UpdateBody.java index 967449c..ebd57aa 100644 --- a/src/main/java/top/octopusyan/manager/http/model/UpdateBody.java +++ b/src/main/java/top/octopusyan/manager/http/model/UpdateBody.java @@ -5,8 +5,8 @@ import okhttp3.RequestBody; import okio.BufferedSink; import okio.Okio; import okio.Source; -import top.octopusyan.manager.http.config.ContentType; import top.octopusyan.manager.http.EasyUtils; +import top.octopusyan.manager.http.config.ContentType; import java.io.File; import java.io.FileNotFoundException; diff --git a/src/main/java/top/octopusyan/manager/http/request/IRequestHandler.java b/src/main/java/top/octopusyan/manager/http/request/IRequestHandler.java index 06c65f7..011df00 100644 --- a/src/main/java/top/octopusyan/manager/http/request/IRequestHandler.java +++ b/src/main/java/top/octopusyan/manager/http/request/IRequestHandler.java @@ -1,12 +1,12 @@ package top.octopusyan.manager.http.request; -import java.lang.reflect.Type; - import okhttp3.Request; import okhttp3.Response; import top.octopusyan.manager.http.EasyUtils; import top.octopusyan.manager.http.api.RequestApi; +import java.lang.reflect.Type; + public interface IRequestHandler { /** @@ -28,7 +28,7 @@ public interface IRequestHandler { * * @throws Exception 如果抛出则回调失败 */ - Object requestSucceed(RequestApi api, Response response, Type type) throws Exception; + Result requestSucceed(RequestApi api, Response response, Type type) throws Exception; /** * 请求失败 diff --git a/src/main/java/top/octopusyan/manager/http/request/RequestHandler.java b/src/main/java/top/octopusyan/manager/http/request/RequestHandler.java index 488b22c..647f6c3 100644 --- a/src/main/java/top/octopusyan/manager/http/request/RequestHandler.java +++ b/src/main/java/top/octopusyan/manager/http/request/RequestHandler.java @@ -8,8 +8,8 @@ import okhttp3.Headers; import okhttp3.Request; import okhttp3.Response; import okhttp3.ResponseBody; -import top.octopusyan.manager.http.api.RequestApi; import top.octopusyan.manager.http.HttpLog; +import top.octopusyan.manager.http.api.RequestApi; import top.octopusyan.manager.http.exception.*; import top.octopusyan.manager.http.response.BaseRest; @@ -24,8 +24,8 @@ import java.net.UnknownHostException; /** * @author octopus yan * @email octopus_yan@foxmail.com - * @Description 请求处理类 - * @createTime 2021-07-23 11:55:26 + * @description 请求处理类 + * @create 2021-07-23 11:55:26 */ public final class RequestHandler implements IRequestHandler { @@ -125,7 +125,7 @@ public final class RequestHandler implements IRequestHandler { } @Override - public Exception requestFail(RequestApi api, Exception e) { + public Exception requestFail(RequestApi api, Exception e) { // 判断这个异常是不是自己抛的 if (e instanceof HttpException) { if (e instanceof TokenException) { @@ -159,9 +159,6 @@ public final class RequestHandler implements IRequestHandler { /** * 传入需要连接的IP,返回是否连接成功 - * - * @param remoteInetAddr - * @return */ public static boolean isReachable(String remoteInetAddr) { boolean reachable = false; diff --git a/src/main/java/top/octopusyan/model/ApplicatonStore.java b/src/main/java/top/octopusyan/model/ApplicatonStore.java index f6a03bb..e758176 100644 --- a/src/main/java/top/octopusyan/model/ApplicatonStore.java +++ b/src/main/java/top/octopusyan/model/ApplicatonStore.java @@ -41,6 +41,7 @@ public class ApplicatonStore { private static final SimpleBooleanProperty registerSuccess = new SimpleBooleanProperty(); private static final ObservableList proxyList = FXCollections.observableList(new ArrayList<>()); private static final SimpleIntegerProperty selectProxy = new SimpleIntegerProperty(0); + public static String selectProxyName = null; public static void setAccount(String account) { ApplicatonStore.account.set(account); @@ -153,11 +154,8 @@ public class ApplicatonStore { if (appDataJson.containsKey(AUTO_LOGIN_KEY)) autoLogin.set(appDataJson.getBoolean(AUTO_LOGIN_KEY)); // 记住 if (appDataJson.containsKey(REMEMBER_ME_KEY)) rememberMe.set(appDataJson.getBoolean(REMEMBER_ME_KEY)); - // TODO 已选择隧道 - if (appDataJson.containsKey(SELECT_PROXY_NAME_KEY)) { -// String proxtName = appDataJson.getString(SELECT_PROXY_NAME_KEY); -// proxyListProperty().addListener(new ); - } + // 已选择隧道 + if (appDataJson.containsKey(SELECT_PROXY_NAME_KEY)) selectProxyName = appDataJson.getString(SELECT_PROXY_NAME_KEY); } /** @@ -174,7 +172,7 @@ public class ApplicatonStore { if (rememberMe.get() && password.get() != null) appDataJson.put(PASSWORD_KEY, password.get()); // 选择隧道 if (selectProxy.getValue() != null && proxyList.size() > 0 && proxyList.size() > selectProxy.get()) - appDataJson.put(SELECT_PROXY_NAME_KEY, proxyList.get(selectProxy.getValue())); + appDataJson.put(SELECT_PROXY_NAME_KEY, proxyList.get(selectProxy.getValue()).getProxy_name()); // 自动登录 appDataJson.put(AUTO_LOGIN_KEY, autoLogin.get()); // 记住 diff --git a/src/main/java/top/octopusyan/utils/FxmlUtil.java b/src/main/java/top/octopusyan/utils/FxmlUtil.java index 8651f8e..fc48145 100644 --- a/src/main/java/top/octopusyan/utils/FxmlUtil.java +++ b/src/main/java/top/octopusyan/utils/FxmlUtil.java @@ -2,9 +2,7 @@ package top.octopusyan.utils; import javafx.fxml.FXMLLoader; import javafx.fxml.JavaFXBuilderFactory; -import sun.reflect.Reflection; -import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; /** diff --git a/src/main/java/top/octopusyan/utils/KaptchaUtil.java b/src/main/java/top/octopusyan/utils/KaptchaUtil.java index f5ef656..fca9212 100644 --- a/src/main/java/top/octopusyan/utils/KaptchaUtil.java +++ b/src/main/java/top/octopusyan/utils/KaptchaUtil.java @@ -1,6 +1,5 @@ package top.octopusyan.utils; -import com.google.code.kaptcha.Producer; import com.google.code.kaptcha.impl.DefaultKaptcha; import com.google.code.kaptcha.util.Config; @@ -15,7 +14,7 @@ import java.util.Properties; */ public class KaptchaUtil { public static volatile KaptchaUtil util; - private DefaultKaptcha defaultKaptcha; + private final DefaultKaptcha defaultKaptcha; private KaptchaUtil(DefaultKaptcha kaptcha){ this.defaultKaptcha = kaptcha;