diff --git a/META-INF/native-image/.lock b/META-INF/native-image/.lock new file mode 100644 index 0000000..b83b06a --- /dev/null +++ b/META-INF/native-image/.lock @@ -0,0 +1 @@ +22916 \ No newline at end of file diff --git a/common/pom.xml b/common/pom.xml deleted file mode 100644 index 4a251d3..0000000 --- a/common/pom.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - 4.0.0 - - org.wowtools.hppt - hppt - 1.0-SNAPSHOT - - - common - - - - com.squareup.okhttp3 - okhttp - - - org.lz4 - lz4-java - 1.8.0 - test - - - com.fasterxml.jackson.dataformat - jackson-dataformat-yaml - - - io.netty - netty-all - - - org.apache.logging.log4j - log4j-slf4j2-impl - - - - org.apache.logging.log4j - log4j-core - - - org.projectlombok - lombok - - - com.google.protobuf - protobuf-java - - - com.fasterxml.jackson.core - jackson-databind - - - org.wowtools - catframe-common - - - - diff --git a/common/src/main/resources/log4j2.xml b/common/src/main/resources/log4j2.xml deleted file mode 100644 index b270ea0..0000000 --- a/common/src/main/resources/log4j2.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - %d{MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n - - - - - - - - - - - - - - - - - - diff --git a/common/src/test/resources/log4j2.xml b/common/src/test/resources/log4j2.xml deleted file mode 100644 index ff635f0..0000000 --- a/common/src/test/resources/log4j2.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n - - - - - - - - - - - - - diff --git a/pom.xml b/pom.xml index b450300..9ef1fdc 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,6 @@ - common run _localtest kafkademo @@ -19,6 +18,7 @@ 21 + 0.10.2 ${java.version} ${java.version} UTF-8 diff --git a/readme.md b/readme.md index ea27fc0..2c82a8f 100644 --- a/readme.md +++ b/readme.md @@ -14,10 +14,23 @@ hppt,一款可通过任意协议转发tcp端口的工具。 ![hppt](_doc/img/1.jpg) # 快速开始 +在[releases](https://github.com/codingmiao/hppt/releases) +页面下载最新版本编译好的hppt,或自行下载源码编译。 +```shell +#jar +mvn clean package -DskipTests + +#可选操作 打native包 +su graalvm +cd run +mvn org.graalvm.buildtools:native-maven-plugin:build +``` -本项目需要jdk21启动,请先前往[jdk官网](https://jdk.java.net/21/) -下载对应你操作系统版本的jdk,然后在[releases](https://github.com/codingmiao/hppt/releases) -页面下载最新版本编译好的hppt.zip,或自行下载源码编译 +本项目编译成了可执行文件及jar包。 + +可执行文件无环境依赖、内存占用,小单因为没有jit支持,性能略逊于jar包执行; + +jar包执行性能更好,但多消耗一些内存,如需jar包执行,请先前往[jdk官网](https://jdk.java.net/archive/)下载对应你操作系统版本的jdk21。 ## 示例1 通过http端口,反向代理访问内部服务器SSH端口 @@ -25,7 +38,7 @@ hppt,一款可通过任意协议转发tcp端口的工具。 ![示例1](_doc/img/3.jpg) -1、在集群中任一服务器上新建一个hppt目录,并上传hppt.jar、ss.yml、log4j2.xml文件到此目录下: +1、在集群中任一服务器上新建一个hppt目录,并上传hppt.jar(也可用可执行文件 hppt.ext 或 hppt)、ss.yml、log4j2.xml文件到此目录下: ``` hppt @@ -41,23 +54,43 @@ hppt type: post #服务http端口 port: 20871 -# 允许的客户端id -clientIds: - - user1 - - user2 +# 允许的客户端账号和密码 +clients: + - user: user1 + password: 12345 + - user: user2 + password: 112233 ``` (注1:作为快速演示,这里的type选择了最简单的post类型,此场景下最佳性能的协议为websocket,或是有独立端口的话可以配置hppt协议,ws、hppt版的说明奋力码字中。。) (注2:实际应用中,为了确保安全,建议把clientId设置得更复杂一些) -执行如下命令运行服务端的hppt +执行如下命令运行服务端的hppt(3选1) +jar包运行 ```shell cd hppt /bin/java -jar hppt.jar ss ss.yml ``` +windows下可执行文件运行 +```shell +cd hppt +chcp 65001 +title "hppt" +hppt.exe ss ss.yml +pause +``` + +linux下可执行文件运行 +```shell +cd hppt +./hppt ss ss.yml +#后台运行用命令 nohup ./hppt ss ss.yml >/dev/null & +``` + + 在nginx上增加一段配置指向hppt ``` @@ -87,8 +120,10 @@ hppt ```yaml # 和服务端的type保持一致 type: post -# 客户端id,必须在服务端的clientIds列表里才能成功连接,每个客户端用一个id,不要重复 -clientId: user1 +# 客户端用户名,每个sc进程用一个,不要重复 +clientUser: user1 +# 客户端密码 +clientPassword: 12345 post: # 服务端http地址,如无法直连,用nginx代理几次填nginx的地址也ok @@ -108,13 +143,30 @@ forwards: ``` -执行如下命令启动客户端的hppt +执行如下命令启动客户端的hppt(3选1) +jar包运行 ```shell cd hppt /bin/java -jar hppt.jar sc sc.yml ``` +windows下可执行文件运行 +```shell +cd hppt +chcp 65001 +title "hppt" +hppt.exe sc sc.yml +pause +``` + +linux下可执行文件运行 +```shell +cd hppt +./hppt sc sc.yml +#后台运行用命令 nohup ./hppt ss ss.yml >/dev/null & +``` + 随后,你就可以在公司用linux连接工具访问localhost的10022端口,来登录应用服务器了 @@ -138,8 +190,10 @@ hppt ```yaml # 通讯协议 本示例使用了性能最好的hppt协议,加r前缀表示客户端和服务端角色互换。这里也可以配http post或websocket type: rhppt -# 客户端id -clientId: user1 +# 客户端用户名,每个sc进程用一个,不要重复 +clientUser: user1 +# 客户端密码 +clientPassword: 12345 # 服务端口 rhppt: @@ -185,9 +239,12 @@ rhppt: host: "111.222.33.44" port: 20871 -# 对应的的客户端id -clientIds: - - user1 +# 允许的客户端账号和密码 +clients: + - user: user1 + password: 12345 + - user: user2 + password: 112233 ``` diff --git a/run/pom.xml b/run/pom.xml index c2e7574..74a3d37 100644 --- a/run/pom.xml +++ b/run/pom.xml @@ -12,16 +12,48 @@ run - org.wowtools.hppt - common - 1.0-SNAPSHOT - compile + com.squareup.okhttp3 + okhttp + + + org.lz4 + lz4-java + 1.8.0 + test + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + + + io.netty + netty-all + + + org.projectlombok + lombok + + + ch.qos.logback + logback-classic + 1.4.11 + + + com.google.protobuf + protobuf-java + + + com.fasterxml.jackson.core + jackson-databind + + + org.wowtools + catframe-common org.eclipse.jetty.toolchain jetty-jakarta-servlet-api 5.0.2 - compile org.eclipse.jetty @@ -83,7 +115,33 @@ + + + org.graalvm.buildtools + native-maven-plugin + ${native.maven.plugin.version} + + + -H:+AddAllCharsets + + org.wowtools.hppt.run.Run + hppt + + + + + graalvm-native-build-tools-snapshots + GraalVM native-build-tools Snapshots + https://raw.githubusercontent.com/graalvm/native-build-tools/snapshots + + false + + + true + + + diff --git a/common/src/main/java/org/wowtools/hppt/common/client/ClientBytesSender.java b/run/src/main/java/org/wowtools/hppt/common/client/ClientBytesSender.java similarity index 100% rename from common/src/main/java/org/wowtools/hppt/common/client/ClientBytesSender.java rename to run/src/main/java/org/wowtools/hppt/common/client/ClientBytesSender.java diff --git a/common/src/main/java/org/wowtools/hppt/common/client/ClientSession.java b/run/src/main/java/org/wowtools/hppt/common/client/ClientSession.java similarity index 100% rename from common/src/main/java/org/wowtools/hppt/common/client/ClientSession.java rename to run/src/main/java/org/wowtools/hppt/common/client/ClientSession.java diff --git a/common/src/main/java/org/wowtools/hppt/common/client/ClientSessionLifecycle.java b/run/src/main/java/org/wowtools/hppt/common/client/ClientSessionLifecycle.java similarity index 100% rename from common/src/main/java/org/wowtools/hppt/common/client/ClientSessionLifecycle.java rename to run/src/main/java/org/wowtools/hppt/common/client/ClientSessionLifecycle.java diff --git a/common/src/main/java/org/wowtools/hppt/common/client/ClientSessionManager.java b/run/src/main/java/org/wowtools/hppt/common/client/ClientSessionManager.java similarity index 100% rename from common/src/main/java/org/wowtools/hppt/common/client/ClientSessionManager.java rename to run/src/main/java/org/wowtools/hppt/common/client/ClientSessionManager.java diff --git a/common/src/main/java/org/wowtools/hppt/common/client/ClientSessionManagerBuilder.java b/run/src/main/java/org/wowtools/hppt/common/client/ClientSessionManagerBuilder.java similarity index 100% rename from common/src/main/java/org/wowtools/hppt/common/client/ClientSessionManagerBuilder.java rename to run/src/main/java/org/wowtools/hppt/common/client/ClientSessionManagerBuilder.java diff --git a/common/src/main/java/org/wowtools/hppt/common/client/ClientTalker.java b/run/src/main/java/org/wowtools/hppt/common/client/ClientTalker.java similarity index 100% rename from common/src/main/java/org/wowtools/hppt/common/client/ClientTalker.java rename to run/src/main/java/org/wowtools/hppt/common/client/ClientTalker.java diff --git a/common/src/main/java/org/wowtools/hppt/common/pojo/SessionBytes.java b/run/src/main/java/org/wowtools/hppt/common/pojo/SessionBytes.java similarity index 100% rename from common/src/main/java/org/wowtools/hppt/common/pojo/SessionBytes.java rename to run/src/main/java/org/wowtools/hppt/common/pojo/SessionBytes.java diff --git a/common/src/main/java/org/wowtools/hppt/common/protobuf/ProtoMessage.java b/run/src/main/java/org/wowtools/hppt/common/protobuf/ProtoMessage.java similarity index 100% rename from common/src/main/java/org/wowtools/hppt/common/protobuf/ProtoMessage.java rename to run/src/main/java/org/wowtools/hppt/common/protobuf/ProtoMessage.java diff --git a/common/src/main/java/org/wowtools/hppt/common/server/LoginClientService.java b/run/src/main/java/org/wowtools/hppt/common/server/LoginClientService.java similarity index 100% rename from common/src/main/java/org/wowtools/hppt/common/server/LoginClientService.java rename to run/src/main/java/org/wowtools/hppt/common/server/LoginClientService.java diff --git a/common/src/main/java/org/wowtools/hppt/common/server/ServerSession.java b/run/src/main/java/org/wowtools/hppt/common/server/ServerSession.java similarity index 100% rename from common/src/main/java/org/wowtools/hppt/common/server/ServerSession.java rename to run/src/main/java/org/wowtools/hppt/common/server/ServerSession.java diff --git a/common/src/main/java/org/wowtools/hppt/common/server/ServerSessionLifecycle.java b/run/src/main/java/org/wowtools/hppt/common/server/ServerSessionLifecycle.java similarity index 100% rename from common/src/main/java/org/wowtools/hppt/common/server/ServerSessionLifecycle.java rename to run/src/main/java/org/wowtools/hppt/common/server/ServerSessionLifecycle.java diff --git a/common/src/main/java/org/wowtools/hppt/common/server/ServerSessionManager.java b/run/src/main/java/org/wowtools/hppt/common/server/ServerSessionManager.java similarity index 100% rename from common/src/main/java/org/wowtools/hppt/common/server/ServerSessionManager.java rename to run/src/main/java/org/wowtools/hppt/common/server/ServerSessionManager.java diff --git a/common/src/main/java/org/wowtools/hppt/common/server/ServerSessionManagerBuilder.java b/run/src/main/java/org/wowtools/hppt/common/server/ServerSessionManagerBuilder.java similarity index 100% rename from common/src/main/java/org/wowtools/hppt/common/server/ServerSessionManagerBuilder.java rename to run/src/main/java/org/wowtools/hppt/common/server/ServerSessionManagerBuilder.java diff --git a/common/src/main/java/org/wowtools/hppt/common/server/ServerTalker.java b/run/src/main/java/org/wowtools/hppt/common/server/ServerTalker.java similarity index 100% rename from common/src/main/java/org/wowtools/hppt/common/server/ServerTalker.java rename to run/src/main/java/org/wowtools/hppt/common/server/ServerTalker.java diff --git a/common/src/main/java/org/wowtools/hppt/common/util/AesCipherUtil.java b/run/src/main/java/org/wowtools/hppt/common/util/AesCipherUtil.java similarity index 100% rename from common/src/main/java/org/wowtools/hppt/common/util/AesCipherUtil.java rename to run/src/main/java/org/wowtools/hppt/common/util/AesCipherUtil.java diff --git a/common/src/main/java/org/wowtools/hppt/common/util/BytesUtil.java b/run/src/main/java/org/wowtools/hppt/common/util/BytesUtil.java similarity index 99% rename from common/src/main/java/org/wowtools/hppt/common/util/BytesUtil.java rename to run/src/main/java/org/wowtools/hppt/common/util/BytesUtil.java index 4577208..6842b52 100644 --- a/common/src/main/java/org/wowtools/hppt/common/util/BytesUtil.java +++ b/run/src/main/java/org/wowtools/hppt/common/util/BytesUtil.java @@ -145,7 +145,7 @@ private static boolean afterWrite(ChannelFuture future, Object msg) { } private static void waitChannelWritable(Channel channel) { - while (!channel.isWritable()) { + while (!channel.isWritable() && channel.isOpen()) { try { Thread.sleep(200); } catch (InterruptedException e) { diff --git a/common/src/main/java/org/wowtools/hppt/common/util/CommonConfig.java b/run/src/main/java/org/wowtools/hppt/common/util/CommonConfig.java similarity index 100% rename from common/src/main/java/org/wowtools/hppt/common/util/CommonConfig.java rename to run/src/main/java/org/wowtools/hppt/common/util/CommonConfig.java diff --git a/common/src/main/java/org/wowtools/hppt/common/util/Constant.java b/run/src/main/java/org/wowtools/hppt/common/util/Constant.java similarity index 100% rename from common/src/main/java/org/wowtools/hppt/common/util/Constant.java rename to run/src/main/java/org/wowtools/hppt/common/util/Constant.java diff --git a/common/src/main/java/org/wowtools/hppt/common/util/DirChangeWatcher.java b/run/src/main/java/org/wowtools/hppt/common/util/DirChangeWatcher.java similarity index 100% rename from common/src/main/java/org/wowtools/hppt/common/util/DirChangeWatcher.java rename to run/src/main/java/org/wowtools/hppt/common/util/DirChangeWatcher.java diff --git a/run/src/main/java/org/wowtools/hppt/common/util/DisableTraceFilter.java b/run/src/main/java/org/wowtools/hppt/common/util/DisableTraceFilter.java new file mode 100644 index 0000000..1686190 --- /dev/null +++ b/run/src/main/java/org/wowtools/hppt/common/util/DisableTraceFilter.java @@ -0,0 +1,25 @@ +package org.wowtools.hppt.common.util; + +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import java.io.IOException; + +/** + * @author liuyu + * @date 2024/8/10 + */ +public class DisableTraceFilter implements Filter { + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + HttpServletRequest httpRequest = (HttpServletRequest) request; + String m = httpRequest.getMethod(); + if ("TRACE".equalsIgnoreCase(m) || "TRACK".equalsIgnoreCase(m)) { + HttpServletResponse httpResponse = (HttpServletResponse) response; + httpResponse.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED); + return; + } + chain.doFilter(request, response); + } +} diff --git a/common/src/main/java/org/wowtools/hppt/common/util/FileConsumerBuffer.java b/run/src/main/java/org/wowtools/hppt/common/util/FileConsumerBuffer.java similarity index 100% rename from common/src/main/java/org/wowtools/hppt/common/util/FileConsumerBuffer.java rename to run/src/main/java/org/wowtools/hppt/common/util/FileConsumerBuffer.java diff --git a/common/src/main/java/org/wowtools/hppt/common/util/FileProducerBuffer.java b/run/src/main/java/org/wowtools/hppt/common/util/FileProducerBuffer.java similarity index 100% rename from common/src/main/java/org/wowtools/hppt/common/util/FileProducerBuffer.java rename to run/src/main/java/org/wowtools/hppt/common/util/FileProducerBuffer.java diff --git a/common/src/main/java/org/wowtools/hppt/common/util/GridAesCipherUtil.java b/run/src/main/java/org/wowtools/hppt/common/util/GridAesCipherUtil.java similarity index 100% rename from common/src/main/java/org/wowtools/hppt/common/util/GridAesCipherUtil.java rename to run/src/main/java/org/wowtools/hppt/common/util/GridAesCipherUtil.java diff --git a/common/src/main/java/org/wowtools/hppt/common/util/HttpUtil.java b/run/src/main/java/org/wowtools/hppt/common/util/HttpUtil.java similarity index 98% rename from common/src/main/java/org/wowtools/hppt/common/util/HttpUtil.java rename to run/src/main/java/org/wowtools/hppt/common/util/HttpUtil.java index fbc5ab6..eaddc8f 100644 --- a/common/src/main/java/org/wowtools/hppt/common/util/HttpUtil.java +++ b/run/src/main/java/org/wowtools/hppt/common/util/HttpUtil.java @@ -8,15 +8,13 @@ import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import java.io.IOException; -import java.net.InetSocketAddress; +import java.nio.charset.Charset; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.cert.X509Certificate; import java.util.concurrent.TimeUnit; -import java.net.Proxy; - /** * @author liuyu * @date 2023/12/22 diff --git a/common/src/main/java/org/wowtools/hppt/common/util/JsonConfig.java b/run/src/main/java/org/wowtools/hppt/common/util/JsonConfig.java similarity index 100% rename from common/src/main/java/org/wowtools/hppt/common/util/JsonConfig.java rename to run/src/main/java/org/wowtools/hppt/common/util/JsonConfig.java diff --git a/common/src/main/java/org/wowtools/hppt/common/util/NettyChannelTypeChecker.java b/run/src/main/java/org/wowtools/hppt/common/util/NettyChannelTypeChecker.java similarity index 100% rename from common/src/main/java/org/wowtools/hppt/common/util/NettyChannelTypeChecker.java rename to run/src/main/java/org/wowtools/hppt/common/util/NettyChannelTypeChecker.java diff --git a/run/src/main/java/org/wowtools/hppt/common/util/ResourcesReader.java b/run/src/main/java/org/wowtools/hppt/common/util/ResourcesReader.java new file mode 100644 index 0000000..e7b6dae --- /dev/null +++ b/run/src/main/java/org/wowtools/hppt/common/util/ResourcesReader.java @@ -0,0 +1,69 @@ +package org.wowtools.hppt.common.util; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; + +/** + * @author liuyu + * @date 2024/8/7 + */ +public class ResourcesReader { + /** + * 获得项目根路径 + * + * @param clazz 定位用的类 + * @return + */ + public static String getRootPath(Class clazz){ + File currentFile; + try { + currentFile = new File(clazz.getProtectionDomain().getCodeSource().getLocation().toURI()); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + String currentDir; + if (currentFile.getName().endsWith("classes")) { + //开发环境下,目录在target\classes下 + currentDir = currentFile.getPath(); + }else { + currentDir = currentFile.getParent(); + } + return currentDir; + } + + /** + * 读取类所处根目录下的文件路径加上path的文件内容为String + * + * @param clazz 定位用的类 + * @param path 类根路径下的相对路径 + * @return + */ + public static String readStr(Class clazz, String path) { + try { + String basePath = getRootPath(clazz); + return readStr(basePath + "/" + path); + } catch (Exception e) { + throw new RuntimeException("读取配置文件异常", e); + } + } + + /** + * 读取绝对路径下的文件的文件内容为String + * + * @param path 绝对路径 + * @return + */ + public static String readStr(String path) { + // 读取文件内容为字符串 + try { + return Files.readString(Paths.get(path)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/common/src/main/java/org/wowtools/hppt/common/util/RoughTimeUtil.java b/run/src/main/java/org/wowtools/hppt/common/util/RoughTimeUtil.java similarity index 100% rename from common/src/main/java/org/wowtools/hppt/common/util/RoughTimeUtil.java rename to run/src/main/java/org/wowtools/hppt/common/util/RoughTimeUtil.java diff --git a/run/src/main/java/org/wowtools/hppt/run/Run.java b/run/src/main/java/org/wowtools/hppt/run/Run.java index 149b538..e86e863 100644 --- a/run/src/main/java/org/wowtools/hppt/run/Run.java +++ b/run/src/main/java/org/wowtools/hppt/run/Run.java @@ -1,10 +1,16 @@ package org.wowtools.hppt.run; +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.joran.JoranConfigurator; +import ch.qos.logback.core.util.StatusPrinter; import io.netty.util.ResourceLeakDetector; -import org.wowtools.common.utils.ResourcesReader; +import org.slf4j.LoggerFactory; +import org.wowtools.hppt.common.util.ResourcesReader; import org.wowtools.hppt.run.sc.RunSc; import org.wowtools.hppt.run.ss.RunSs; +import java.io.File; + /** * @author liuyu * @date 2024/1/5 @@ -12,15 +18,24 @@ public class Run { public static void main(String[] args) throws Exception { + System.setProperty("logFileName", args.length > 0 ? String.join("-", args).replace(".", "_") : "hppt"); + try { + LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); + File externalConfigFile = new File(ResourcesReader.getRootPath(Run.class) + "/logback.xml"); + JoranConfigurator configurator = new JoranConfigurator(); + configurator.setContext(context); + context.reset(); + configurator.doConfigure(externalConfigFile); + StatusPrinter.printInCaseOfErrorsOrWarnings(context); + } catch (Exception e) { + System.out.println("未加载到根目录下logback.xml文件,使用默认配置 " + e.getMessage()); + } try { if ("1".equals(ResourcesReader.readStr(Run.class, "/debug.txt").trim())) { ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.PARANOID); System.out.println("开启调试"); - } else { - System.out.println("不开启调试"); } } catch (Exception e) { - System.out.println("不开启调试"); } String type = args[0]; switch (type) { diff --git a/run/src/main/java/org/wowtools/hppt/run/sc/RunSc.java b/run/src/main/java/org/wowtools/hppt/run/sc/RunSc.java index 340ccf2..9b162e0 100644 --- a/run/src/main/java/org/wowtools/hppt/run/sc/RunSc.java +++ b/run/src/main/java/org/wowtools/hppt/run/sc/RunSc.java @@ -1,9 +1,8 @@ package org.wowtools.hppt.run.sc; import lombok.extern.slf4j.Slf4j; -import org.apache.logging.log4j.core.config.Configurator; -import org.wowtools.common.utils.ResourcesReader; import org.wowtools.hppt.common.util.Constant; +import org.wowtools.hppt.common.util.ResourcesReader; import org.wowtools.hppt.run.sc.file.FileClientSessionService; import org.wowtools.hppt.run.sc.hppt.HpptClientSessionService; import org.wowtools.hppt.run.sc.pojo.ScConfig; @@ -20,9 +19,6 @@ */ @Slf4j public class RunSc { - static { - Configurator.reconfigure(new File(ResourcesReader.getRootPath(RunSc.class) + "/log4j2.xml").toURI()); - } public static void main(String[] args) { String configPath; diff --git a/run/src/main/java/org/wowtools/hppt/run/sc/rpost/RPostClientSessionService.java b/run/src/main/java/org/wowtools/hppt/run/sc/rpost/RPostClientSessionService.java index cce4195..0b76a79 100644 --- a/run/src/main/java/org/wowtools/hppt/run/sc/rpost/RPostClientSessionService.java +++ b/run/src/main/java/org/wowtools/hppt/run/sc/rpost/RPostClientSessionService.java @@ -10,6 +10,7 @@ import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.wowtools.hppt.common.util.BytesUtil; +import org.wowtools.hppt.common.util.DisableTraceFilter; import org.wowtools.hppt.run.sc.common.ClientSessionService; import org.wowtools.hppt.run.sc.pojo.ScConfig; import org.wowtools.hppt.run.ss.post.ErrorServlet; @@ -147,19 +148,4 @@ private void r(HttpServletRequest req, HttpServletResponse resp) throws Exceptio } } - - //禁用TRACE、TRACK - public static final class DisableTraceFilter implements Filter { - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - HttpServletRequest httpRequest = (HttpServletRequest) request; - String m = httpRequest.getMethod(); - if ("TRACE".equalsIgnoreCase(m) || "TRACK".equalsIgnoreCase(m)) { - HttpServletResponse httpResponse = (HttpServletResponse) response; - httpResponse.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED); - return; - } - chain.doFilter(request, response); - } - } } diff --git a/run/src/main/java/org/wowtools/hppt/run/ss/RunSs.java b/run/src/main/java/org/wowtools/hppt/run/ss/RunSs.java index 0a07837..3131f17 100644 --- a/run/src/main/java/org/wowtools/hppt/run/ss/RunSs.java +++ b/run/src/main/java/org/wowtools/hppt/run/ss/RunSs.java @@ -1,9 +1,8 @@ package org.wowtools.hppt.run.ss; import lombok.extern.slf4j.Slf4j; -import org.apache.logging.log4j.core.config.Configurator; -import org.wowtools.common.utils.ResourcesReader; import org.wowtools.hppt.common.util.Constant; +import org.wowtools.hppt.common.util.ResourcesReader; import org.wowtools.hppt.run.ss.common.ServerSessionService; import org.wowtools.hppt.run.ss.file.FileServerSessionService; import org.wowtools.hppt.run.ss.hppt.HpptServerSessionService; @@ -13,8 +12,6 @@ import org.wowtools.hppt.run.ss.rpost.RPostServerSessionService; import org.wowtools.hppt.run.ss.websocket.WebsocketServerSessionService; -import java.io.File; - /** * @author liuyu * @date 2024/1/24 @@ -22,12 +19,6 @@ @Slf4j public class RunSs { - - static { - Configurator.reconfigure(new File(ResourcesReader.getRootPath(RunSs.class) + "/log4j2.xml").toURI()); - } - - public static void main(String[] args) throws Exception { String configPath; if (args.length <= 1) { diff --git a/run/src/main/java/org/wowtools/hppt/run/ss/post/PostServerSessionService.java b/run/src/main/java/org/wowtools/hppt/run/ss/post/PostServerSessionService.java index 3dec930..55fc025 100644 --- a/run/src/main/java/org/wowtools/hppt/run/ss/post/PostServerSessionService.java +++ b/run/src/main/java/org/wowtools/hppt/run/ss/post/PostServerSessionService.java @@ -1,8 +1,5 @@ package org.wowtools.hppt.run.ss.post; -import jakarta.servlet.*; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; @@ -10,10 +7,10 @@ import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.wowtools.common.utils.LruCache; +import org.wowtools.hppt.common.util.DisableTraceFilter; import org.wowtools.hppt.run.ss.common.ServerSessionService; import org.wowtools.hppt.run.ss.pojo.SsConfig; -import java.io.IOException; import java.util.Map; /** @@ -79,19 +76,4 @@ public void doClose() throws Exception { } - //禁用TRACE、TRACK - public static final class DisableTraceFilter implements Filter { - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - HttpServletRequest httpRequest = (HttpServletRequest) request; - String m = httpRequest.getMethod(); - if ("TRACE".equalsIgnoreCase(m) || "TRACK".equalsIgnoreCase(m)) { - HttpServletResponse httpResponse = (HttpServletResponse) response; - httpResponse.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED); - return; - } - chain.doFilter(request, response); - } - } - } diff --git a/run/src/main/java/org/wowtools/hppt/run/transmit/transport/PostServerTransport.java b/run/src/main/java/org/wowtools/hppt/run/transmit/transport/PostServerTransport.java index fee719b..0431eb1 100644 --- a/run/src/main/java/org/wowtools/hppt/run/transmit/transport/PostServerTransport.java +++ b/run/src/main/java/org/wowtools/hppt/run/transmit/transport/PostServerTransport.java @@ -10,6 +10,7 @@ import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.wowtools.hppt.common.util.BytesUtil; +import org.wowtools.hppt.common.util.DisableTraceFilter; import org.wowtools.hppt.common.util.JsonConfig; import org.wowtools.hppt.run.ss.post.PostServerSessionService; @@ -77,7 +78,7 @@ public HttpServer(int port) throws Exception { errorHandler.setServer(new Server()); context.setErrorHandler(errorHandler); - context.addFilter(PostServerSessionService.DisableTraceFilter.class, "/*", null); + context.addFilter(DisableTraceFilter.class, "/*", null); server.start(); // server.join(); diff --git a/run/src/main/resources/META-INF/native-image/jni-config.json b/run/src/main/resources/META-INF/native-image/jni-config.json new file mode 100644 index 0000000..7516acc --- /dev/null +++ b/run/src/main/resources/META-INF/native-image/jni-config.json @@ -0,0 +1,27 @@ +[ { + "name" : "java.lang.Boolean", + "methods" : [ { + "name" : "getBoolean", + "parameterTypes" : [ "java.lang.String" ] + } ], + "fields" : [ ] +}, { + "name" : "sun.management.VMManagementImpl", + "fields" : [ { + "name" : "compTimeMonitoringSupport" + }, { + "name" : "currentThreadCpuTimeSupport" + }, { + "name" : "objectMonitorUsageSupport" + }, { + "name" : "otherThreadCpuTimeSupport" + }, { + "name" : "remoteDiagnosticCommandsSupport" + }, { + "name" : "synchronizerUsageSupport" + }, { + "name" : "threadAllocatedMemorySupport" + }, { + "name" : "threadContentionMonitoringSupport" + } ] +} ] \ No newline at end of file diff --git a/run/src/main/resources/META-INF/native-image/predefined-classes-config.json b/run/src/main/resources/META-INF/native-image/predefined-classes-config.json new file mode 100644 index 0000000..d4201d9 --- /dev/null +++ b/run/src/main/resources/META-INF/native-image/predefined-classes-config.json @@ -0,0 +1,4 @@ +[ { + "type" : "agent-extracted", + "classes" : [ ] +} ] \ No newline at end of file diff --git a/run/src/main/resources/META-INF/native-image/reflect-config.json b/run/src/main/resources/META-INF/native-image/reflect-config.json new file mode 100644 index 0000000..5028623 --- /dev/null +++ b/run/src/main/resources/META-INF/native-image/reflect-config.json @@ -0,0 +1,1032 @@ +[ { + "name" : "ch.qos.logback.classic.encoder.PatternLayoutEncoder", + "queryAllPublicMethods" : true, + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "ch.qos.logback.classic.joran.SerializedModelConfigurator", + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "ch.qos.logback.classic.pattern.DateConverter", + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "ch.qos.logback.classic.pattern.LevelConverter", + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "ch.qos.logback.classic.pattern.LineSeparatorConverter", + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "ch.qos.logback.classic.pattern.LoggerConverter", + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "ch.qos.logback.classic.pattern.MessageConverter", + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "ch.qos.logback.classic.util.DefaultJoranConfigurator", + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "ch.qos.logback.core.ConsoleAppender", + "queryAllPublicMethods" : true, + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "ch.qos.logback.core.FileAppender", + "methods" : [ { + "name" : "valueOf", + "parameterTypes" : [ "java.lang.String" ] + } ] +}, { + "name" : "ch.qos.logback.core.OutputStreamAppender", + "methods" : [ { + "name" : "setEncoder", + "parameterTypes" : [ "ch.qos.logback.core.encoder.Encoder" ] + } ] +}, { + "name" : "ch.qos.logback.core.encoder.Encoder", + "methods" : [ { + "name" : "valueOf", + "parameterTypes" : [ "java.lang.String" ] + } ] +}, { + "name" : "ch.qos.logback.core.encoder.LayoutWrappingEncoder", + "methods" : [ { + "name" : "setParent", + "parameterTypes" : [ "ch.qos.logback.core.spi.ContextAware" ] + } ] +}, { + "name" : "ch.qos.logback.core.pattern.PatternLayoutEncoderBase", + "methods" : [ { + "name" : "setPattern", + "parameterTypes" : [ "java.lang.String" ] + } ] +}, { + "name" : "ch.qos.logback.core.rolling.RollingFileAppender", + "queryAllPublicMethods" : true, + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + }, { + "name" : "setFile", + "parameterTypes" : [ "java.lang.String" ] + }, { + "name" : "setRollingPolicy", + "parameterTypes" : [ "ch.qos.logback.core.rolling.RollingPolicy" ] + } ] +}, { + "name" : "ch.qos.logback.core.rolling.RollingPolicy", + "methods" : [ { + "name" : "valueOf", + "parameterTypes" : [ "java.lang.String" ] + } ] +}, { + "name" : "ch.qos.logback.core.rolling.RollingPolicyBase", + "methods" : [ { + "name" : "setFileNamePattern", + "parameterTypes" : [ "java.lang.String" ] + }, { + "name" : "setParent", + "parameterTypes" : [ "ch.qos.logback.core.FileAppender" ] + } ] +}, { + "name" : "ch.qos.logback.core.rolling.TimeBasedRollingPolicy", + "queryAllPublicMethods" : true, + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + }, { + "name" : "setMaxHistory", + "parameterTypes" : [ "int" ] + } ] +}, { + "name" : "ch.qos.logback.core.rolling.helper.DateTokenConverter", + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "ch.qos.logback.core.spi.ContextAware", + "methods" : [ { + "name" : "valueOf", + "parameterTypes" : [ "java.lang.String" ] + } ] +}, { + "name" : "com.fasterxml.jackson.databind.ext.Java7HandlersImpl", + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "com.fasterxml.jackson.databind.ext.Java7SupportImpl", + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "com.google.protobuf.ExtensionRegistry", + "methods" : [ { + "name" : "getEmptyRegistry", + "parameterTypes" : [ ] + } ] +}, { + "name" : "com.sun.crypto.provider.AESCipher$General", + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "com.sun.crypto.provider.AESKeyGenerator", + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "com.sun.crypto.provider.ARCFOURCipher", + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "com.sun.crypto.provider.ChaCha20Cipher$ChaCha20Poly1305", + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "com.sun.crypto.provider.DESCipher", + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "com.sun.crypto.provider.DESedeCipher", + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "com.sun.crypto.provider.GaloisCounterMode$AESGCM", + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl", + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "io.netty.bootstrap.ServerBootstrap$1", + "methods" : [ ] +}, { + "name" : "io.netty.bootstrap.ServerBootstrap$ServerBootstrapAcceptor", + "methods" : [ { + "name" : "channelRead", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext", "java.lang.Object" ] + }, { + "name" : "exceptionCaught", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext", "java.lang.Throwable" ] + } ] +}, { + "name" : "io.netty.buffer.AbstractByteBufAllocator", + "queryAllDeclaredMethods" : true, + "methods" : [ ] +}, { + "name" : "io.netty.buffer.AbstractReferenceCountedByteBuf", + "fields" : [ { + "name" : "refCnt" + } ], + "methods" : [ ] +}, { + "name" : "io.netty.channel.AbstractChannelHandlerContext", + "fields" : [ { + "name" : "handlerState" + } ], + "methods" : [ ] +}, { + "name" : "io.netty.channel.ChannelInboundHandlerAdapter", + "methods" : [ { + "name" : "channelActive", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext" ] + }, { + "name" : "channelInactive", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext" ] + }, { + "name" : "channelRead", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext", "java.lang.Object" ] + }, { + "name" : "channelReadComplete", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext" ] + }, { + "name" : "channelRegistered", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext" ] + }, { + "name" : "channelUnregistered", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext" ] + }, { + "name" : "channelWritabilityChanged", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext" ] + }, { + "name" : "userEventTriggered", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext", "java.lang.Object" ] + } ] +}, { + "name" : "io.netty.channel.ChannelInitializer", + "methods" : [ { + "name" : "channelRegistered", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext" ] + }, { + "name" : "exceptionCaught", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext", "java.lang.Throwable" ] + } ] +}, { + "name" : "io.netty.channel.ChannelOutboundBuffer", + "fields" : [ { + "name" : "totalPendingSize" + }, { + "name" : "unwritable" + } ], + "methods" : [ ] +}, { + "name" : "io.netty.channel.DefaultChannelConfig", + "fields" : [ { + "name" : "autoRead" + }, { + "name" : "writeBufferWaterMark" + } ], + "methods" : [ ] +}, { + "name" : "io.netty.channel.DefaultChannelPipeline", + "fields" : [ { + "name" : "estimatorHandle" + } ], + "methods" : [ ] +}, { + "name" : "io.netty.channel.DefaultChannelPipeline$HeadContext", + "methods" : [ { + "name" : "bind", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext", "java.net.SocketAddress", "io.netty.channel.ChannelPromise" ] + }, { + "name" : "channelActive", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext" ] + }, { + "name" : "channelInactive", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext" ] + }, { + "name" : "channelRead", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext", "java.lang.Object" ] + }, { + "name" : "channelReadComplete", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext" ] + }, { + "name" : "channelRegistered", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext" ] + }, { + "name" : "channelUnregistered", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext" ] + }, { + "name" : "channelWritabilityChanged", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext" ] + }, { + "name" : "close", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext", "io.netty.channel.ChannelPromise" ] + }, { + "name" : "connect", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext", "java.net.SocketAddress", "java.net.SocketAddress", "io.netty.channel.ChannelPromise" ] + }, { + "name" : "deregister", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext", "io.netty.channel.ChannelPromise" ] + }, { + "name" : "disconnect", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext", "io.netty.channel.ChannelPromise" ] + }, { + "name" : "exceptionCaught", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext", "java.lang.Throwable" ] + }, { + "name" : "flush", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext" ] + }, { + "name" : "read", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext" ] + }, { + "name" : "userEventTriggered", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext", "java.lang.Object" ] + }, { + "name" : "write", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext", "java.lang.Object", "io.netty.channel.ChannelPromise" ] + } ] +}, { + "name" : "io.netty.channel.DefaultChannelPipeline$TailContext", + "methods" : [ { + "name" : "channelActive", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext" ] + }, { + "name" : "channelInactive", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext" ] + }, { + "name" : "channelRead", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext", "java.lang.Object" ] + }, { + "name" : "channelReadComplete", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext" ] + }, { + "name" : "channelRegistered", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext" ] + }, { + "name" : "channelUnregistered", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext" ] + }, { + "name" : "channelWritabilityChanged", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext" ] + }, { + "name" : "exceptionCaught", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext", "java.lang.Throwable" ] + }, { + "name" : "userEventTriggered", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext", "java.lang.Object" ] + } ] +}, { + "name" : "io.netty.channel.socket.nio.NioServerSocketChannel", + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "io.netty.handler.codec.ByteToMessageDecoder", + "methods" : [ { + "name" : "channelRead", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext", "java.lang.Object" ] + }, { + "name" : "channelReadComplete", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext" ] + }, { + "name" : "userEventTriggered", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext", "java.lang.Object" ] + } ] +}, { + "name" : "io.netty.util.DefaultAttributeMap", + "fields" : [ { + "name" : "attributes" + } ], + "methods" : [ ] +}, { + "name" : "io.netty.util.Recycler$DefaultHandle", + "fields" : [ { + "name" : "state" + } ], + "methods" : [ ] +}, { + "name" : "io.netty.util.ReferenceCountUtil", + "queryAllDeclaredMethods" : true, + "methods" : [ ] +}, { + "name" : "io.netty.util.ResourceLeakDetector$DefaultResourceLeak", + "fields" : [ { + "name" : "droppedRecords" + }, { + "name" : "head" + } ], + "methods" : [ ] +}, { + "name" : "io.netty.util.concurrent.DefaultPromise", + "fields" : [ { + "name" : "result" + } ], + "methods" : [ ] +}, { + "name" : "io.netty.util.concurrent.SingleThreadEventExecutor", + "fields" : [ { + "name" : "state" + }, { + "name" : "threadProperties" + } ], + "methods" : [ ] +}, { + "name" : "io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueColdProducerFields", + "fields" : [ { + "name" : "producerLimit" + } ], + "methods" : [ ] +}, { + "name" : "io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueConsumerFields", + "fields" : [ { + "name" : "consumerIndex" + } ], + "methods" : [ ] +}, { + "name" : "io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueProducerFields", + "fields" : [ { + "name" : "producerIndex" + } ], + "methods" : [ ] +}, { + "name" : "io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueConsumerIndexField", + "fields" : [ { + "name" : "consumerIndex" + } ], + "methods" : [ ] +}, { + "name" : "io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueProducerIndexField", + "fields" : [ { + "name" : "producerIndex" + } ], + "methods" : [ ] +}, { + "name" : "io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueProducerLimitField", + "fields" : [ { + "name" : "producerLimit" + } ], + "methods" : [ ] +}, { + "name" : "java.io.FilePermission", + "methods" : [ ] +}, { + "name" : "java.lang.ProcessHandle", + "methods" : [ { + "name" : "current", + "parameterTypes" : [ ] + }, { + "name" : "pid", + "parameterTypes" : [ ] + } ] +}, { + "name" : "java.lang.RuntimePermission", + "methods" : [ ] +}, { + "name" : "java.lang.Thread", + "fields" : [ { + "name" : "threadLocalRandomProbe" + } ], + "methods" : [ { + "name" : "isVirtual", + "parameterTypes" : [ ] + } ] +}, { + "name" : "java.lang.Throwable", + "methods" : [ { + "name" : "addSuppressed", + "parameterTypes" : [ "java.lang.Throwable" ] + } ] +}, { + "name" : "java.lang.management.ManagementFactory", + "methods" : [ { + "name" : "getRuntimeMXBean", + "parameterTypes" : [ ] + } ] +}, { + "name" : "java.lang.management.RuntimeMXBean", + "methods" : [ { + "name" : "getInputArguments", + "parameterTypes" : [ ] + }, { + "name" : "getUptime", + "parameterTypes" : [ ] + } ] +}, { + "name" : "java.net.NetPermission", + "methods" : [ ] +}, { + "name" : "java.net.SocketPermission", + "methods" : [ ] +}, { + "name" : "java.net.URLPermission", + "methods" : [ { + "name" : "", + "parameterTypes" : [ "java.lang.String", "java.lang.String" ] + } ] +}, { + "name" : "java.nio.Bits", + "fields" : [ { + "name" : "UNALIGNED" + } ], + "methods" : [ ] +}, { + "name" : "java.nio.Buffer", + "fields" : [ { + "name" : "address" + } ], + "methods" : [ ] +}, { + "name" : "java.nio.ByteBuffer", + "methods" : [ { + "name" : "alignedSlice", + "parameterTypes" : [ "int" ] + } ] +}, { + "name" : "java.nio.DirectByteBuffer", + "methods" : [ { + "name" : "", + "parameterTypes" : [ "long", "int" ] + } ] +}, { + "name" : "java.nio.channels.spi.SelectorProvider", + "methods" : [ { + "name" : "openServerSocketChannel", + "parameterTypes" : [ "java.net.ProtocolFamily" ] + }, { + "name" : "openSocketChannel", + "parameterTypes" : [ "java.net.ProtocolFamily" ] + } ] +}, { + "name" : "java.security.AlgorithmParametersSpi", + "methods" : [ ] +}, { + "name" : "java.security.AllPermission", + "methods" : [ ] +}, { + "name" : "java.security.SecureRandomParameters", + "methods" : [ ] +}, { + "name" : "java.security.SecurityPermission", + "methods" : [ ] +}, { + "name" : "java.sql.Date", + "methods" : [ ] +}, { + "name" : "java.sql.Timestamp", + "methods" : [ ] +}, { + "name" : "java.util.PropertyPermission", + "methods" : [ ] +}, { + "name" : "java.util.concurrent.ForkJoinTask", + "fields" : [ { + "name" : "aux" + }, { + "name" : "status" + } ], + "methods" : [ ] +}, { + "name" : "java.util.concurrent.atomic.AtomicBoolean", + "fields" : [ { + "name" : "value" + } ], + "methods" : [ ] +}, { + "name" : "java.util.concurrent.atomic.AtomicReference", + "fields" : [ { + "name" : "value" + } ], + "methods" : [ ] +}, { + "name" : "java.util.concurrent.atomic.Striped64", + "fields" : [ { + "name" : "base" + }, { + "name" : "cellsBusy" + } ], + "methods" : [ ] +}, { + "name" : "javax.net.ssl.SSLParameters", + "methods" : [ { + "name" : "setApplicationProtocols", + "parameterTypes" : [ "java.lang.String[]" ] + } ] +}, { + "name" : "javax.net.ssl.SSLSocket", + "methods" : [ { + "name" : "getApplicationProtocol", + "parameterTypes" : [ ] + } ] +}, { + "name" : "javax.smartcardio.CardPermission", + "methods" : [ ] +}, { + "name" : "jdk.internal.misc.Unsafe", + "methods" : [ { + "name" : "getUnsafe", + "parameterTypes" : [ ] + } ] +}, { + "name" : "libcore.io.Memory", + "methods" : [ ] +}, { + "name" : "org.robolectric.Robolectric", + "methods" : [ ] +}, { + "name" : "org.wowtools.hppt.common.client.ClientSessionManager$1", + "methods" : [ ] +}, { + "name" : "org.wowtools.hppt.common.client.ClientSessionManager$SimpleHandler", + "methods" : [ { + "name" : "channelActive", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext" ] + }, { + "name" : "channelInactive", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext" ] + }, { + "name" : "exceptionCaught", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext", "java.lang.Throwable" ] + } ] +}, { + "name" : "org.wowtools.hppt.common.util.CommonConfig", + "allDeclaredFields" : true, + "queryAllDeclaredMethods" : true, + "methods" : [ ] +}, { + "name" : "org.wowtools.hppt.run.sc.pojo.ScConfig", + "allDeclaredFields" : true, + "queryAllDeclaredMethods" : true, + "queryAllDeclaredConstructors" : true, + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "org.wowtools.hppt.run.sc.pojo.ScConfig$FileConfig", + "allDeclaredFields" : true, + "queryAllDeclaredMethods" : true, + "queryAllDeclaredConstructors" : true, + "methods" : [ ] +}, { + "name" : "org.wowtools.hppt.run.sc.pojo.ScConfig$Forward", + "allDeclaredFields" : true, + "queryAllDeclaredMethods" : true, + "queryAllDeclaredConstructors" : true, + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "org.wowtools.hppt.run.sc.pojo.ScConfig$HpptConfig", + "allDeclaredFields" : true, + "queryAllDeclaredMethods" : true, + "queryAllDeclaredConstructors" : true, + "methods" : [ ] +}, { + "name" : "org.wowtools.hppt.run.sc.pojo.ScConfig$PostConfig", + "allDeclaredFields" : true, + "queryAllDeclaredMethods" : true, + "queryAllDeclaredConstructors" : true, + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "org.wowtools.hppt.run.sc.pojo.ScConfig$RHpptConfig", + "allDeclaredFields" : true, + "queryAllDeclaredMethods" : true, + "queryAllDeclaredConstructors" : true, + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "org.wowtools.hppt.run.sc.pojo.ScConfig$RPostConfig", + "allDeclaredFields" : true, + "queryAllDeclaredMethods" : true, + "queryAllDeclaredConstructors" : true, + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "org.wowtools.hppt.run.sc.pojo.ScConfig$WebSocketConfig", + "allDeclaredFields" : true, + "queryAllDeclaredMethods" : true, + "queryAllDeclaredConstructors" : true, + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "sun.misc.Unsafe", + "allDeclaredFields" : true, + "methods" : [ { + "name" : "arrayBaseOffset", + "parameterTypes" : [ "java.lang.Class" ] + }, { + "name" : "arrayIndexScale", + "parameterTypes" : [ "java.lang.Class" ] + }, { + "name" : "copyMemory", + "parameterTypes" : [ "long", "long", "long" ] + }, { + "name" : "copyMemory", + "parameterTypes" : [ "java.lang.Object", "long", "java.lang.Object", "long", "long" ] + }, { + "name" : "getAndAddLong", + "parameterTypes" : [ "java.lang.Object", "long", "long" ] + }, { + "name" : "getAndSetObject", + "parameterTypes" : [ "java.lang.Object", "long", "java.lang.Object" ] + }, { + "name" : "getBoolean", + "parameterTypes" : [ "java.lang.Object", "long" ] + }, { + "name" : "getByte", + "parameterTypes" : [ "long" ] + }, { + "name" : "getByte", + "parameterTypes" : [ "java.lang.Object", "long" ] + }, { + "name" : "getDouble", + "parameterTypes" : [ "java.lang.Object", "long" ] + }, { + "name" : "getFloat", + "parameterTypes" : [ "java.lang.Object", "long" ] + }, { + "name" : "getInt", + "parameterTypes" : [ "long" ] + }, { + "name" : "getInt", + "parameterTypes" : [ "java.lang.Object", "long" ] + }, { + "name" : "getLong", + "parameterTypes" : [ "long" ] + }, { + "name" : "getLong", + "parameterTypes" : [ "java.lang.Object", "long" ] + }, { + "name" : "getObject", + "parameterTypes" : [ "java.lang.Object", "long" ] + }, { + "name" : "invokeCleaner", + "parameterTypes" : [ "java.nio.ByteBuffer" ] + }, { + "name" : "objectFieldOffset", + "parameterTypes" : [ "java.lang.reflect.Field" ] + }, { + "name" : "putBoolean", + "parameterTypes" : [ "java.lang.Object", "long", "boolean" ] + }, { + "name" : "putByte", + "parameterTypes" : [ "long", "byte" ] + }, { + "name" : "putByte", + "parameterTypes" : [ "java.lang.Object", "long", "byte" ] + }, { + "name" : "putDouble", + "parameterTypes" : [ "java.lang.Object", "long", "double" ] + }, { + "name" : "putFloat", + "parameterTypes" : [ "java.lang.Object", "long", "float" ] + }, { + "name" : "putInt", + "parameterTypes" : [ "long", "int" ] + }, { + "name" : "putInt", + "parameterTypes" : [ "java.lang.Object", "long", "int" ] + }, { + "name" : "putLong", + "parameterTypes" : [ "long", "long" ] + }, { + "name" : "putLong", + "parameterTypes" : [ "java.lang.Object", "long", "long" ] + }, { + "name" : "putObject", + "parameterTypes" : [ "java.lang.Object", "long", "java.lang.Object" ] + }, { + "name" : "storeFence", + "parameterTypes" : [ ] + } ] +}, { + "name" : "sun.misc.VM", + "methods" : [ ] +}, { + "name" : "sun.nio.ch.SelectorImpl", + "fields" : [ { + "name" : "publicSelectedKeys" + }, { + "name" : "selectedKeys" + } ], + "methods" : [ ] +}, { + "name" : "sun.security.provider.DRBG", + "methods" : [ { + "name" : "", + "parameterTypes" : [ "java.security.SecureRandomParameters" ] + } ] +}, { + "name" : "sun.security.provider.SHA", + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "sun.security.provider.SHA2$SHA256", + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "sun.security.provider.SecureRandom", + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + }, { + "name" : "", + "parameterTypes" : [ "java.security.SecureRandomParameters" ] + } ] +}, { + "name" : "sun.security.ssl.SSLContextImpl$TLSContext", + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "io.netty.channel.socket.nio.NioSocketChannel", + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "java.lang.Boolean", + "methods" : [ { + "name" : "valueOf", + "parameterTypes" : [ "java.lang.String" ] + } ] +}, { + "name" : "java.lang.Byte", + "methods" : [ { + "name" : "valueOf", + "parameterTypes" : [ "java.lang.String" ] + } ] +}, { + "name" : "java.lang.Double", + "methods" : [ { + "name" : "valueOf", + "parameterTypes" : [ "java.lang.String" ] + } ] +}, { + "name" : "java.lang.Float", + "methods" : [ { + "name" : "valueOf", + "parameterTypes" : [ "java.lang.String" ] + } ] +}, { + "name" : "java.lang.Integer", + "methods" : [ { + "name" : "valueOf", + "parameterTypes" : [ "java.lang.String" ] + } ] +}, { + "name" : "java.lang.Long", + "methods" : [ { + "name" : "valueOf", + "parameterTypes" : [ "java.lang.String" ] + } ] +}, { + "name" : "java.lang.Short", + "methods" : [ { + "name" : "valueOf", + "parameterTypes" : [ "java.lang.String" ] + } ] +}, { + "name" : "java.lang.System", + "methods" : [ { + "name" : "getSecurityManager", + "parameterTypes" : [ ] + } ] +}, { + "name" : "java.security.AccessController", + "methods" : [ { + "name" : "doPrivileged", + "parameterTypes" : [ "java.security.PrivilegedAction" ] + } ] +}, { + "name" : "java.util.concurrent.Executors", + "methods" : [ { + "name" : "newVirtualThreadPerTaskExecutor", + "parameterTypes" : [ ] + } ] +}, { + "name" : "org.eclipse.jetty.util.TypeUtil", + "methods" : [ { + "name" : "getClassLoaderLocation", + "parameterTypes" : [ "java.lang.Class" ] + }, { + "name" : "getCodeSourceLocation", + "parameterTypes" : [ "java.lang.Class" ] + }, { + "name" : "getModuleLocation", + "parameterTypes" : [ "java.lang.Class" ] + }, { + "name" : "getSystemClassLoaderLocation", + "parameterTypes" : [ "java.lang.Class" ] + } ] +}, { + "name" : "org.wowtools.hppt.common.server.ServerSessionManager$1", + "methods" : [ ] +}, { + "name" : "org.wowtools.hppt.common.server.ServerSessionManager$SimpleHandler", + "methods" : [ { + "name" : "channelActive", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext" ] + }, { + "name" : "channelInactive", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext" ] + }, { + "name" : "channelRead", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext", "java.lang.Object" ] + }, { + "name" : "channelReadComplete", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext" ] + }, { + "name" : "exceptionCaught", + "parameterTypes" : [ "io.netty.channel.ChannelHandlerContext", "java.lang.Throwable" ] + } ] +}, { + "name" : "org.wowtools.hppt.common.util.DisableTraceFilter", + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "org.wowtools.hppt.run.ss.pojo.SsConfig", + "allDeclaredFields" : true, + "queryAllDeclaredMethods" : true, + "queryAllDeclaredConstructors" : true, + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "org.wowtools.hppt.run.ss.pojo.SsConfig$Client", + "allDeclaredFields" : true, + "queryAllDeclaredMethods" : true, + "queryAllDeclaredConstructors" : true, + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "org.wowtools.hppt.run.ss.pojo.SsConfig$FileConfig", + "allDeclaredFields" : true, + "queryAllDeclaredMethods" : true, + "queryAllDeclaredConstructors" : true, + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "org.wowtools.hppt.run.ss.pojo.SsConfig$HpptConfig", + "allDeclaredFields" : true, + "queryAllDeclaredMethods" : true, + "queryAllDeclaredConstructors" : true, + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "org.wowtools.hppt.run.ss.pojo.SsConfig$PostConfig", + "allDeclaredFields" : true, + "queryAllDeclaredMethods" : true, + "queryAllDeclaredConstructors" : true, + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "org.wowtools.hppt.run.ss.pojo.SsConfig$RHpptConfig", + "allDeclaredFields" : true, + "queryAllDeclaredMethods" : true, + "queryAllDeclaredConstructors" : true, + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "org.wowtools.hppt.run.ss.pojo.SsConfig$RPostConfig", + "allDeclaredFields" : true, + "queryAllDeclaredMethods" : true, + "queryAllDeclaredConstructors" : true, + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +}, { + "name" : "org.wowtools.hppt.run.ss.pojo.SsConfig$WebSocketConfig", + "allDeclaredFields" : true, + "queryAllDeclaredMethods" : true, + "queryAllDeclaredConstructors" : true, + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + } ] +} ] diff --git a/run/src/main/resources/META-INF/native-image/resource-config.json b/run/src/main/resources/META-INF/native-image/resource-config.json new file mode 100644 index 0000000..6fb0179 --- /dev/null +++ b/run/src/main/resources/META-INF/native-image/resource-config.json @@ -0,0 +1,44 @@ +{ + "resources" : { + "bundles" : [ ], + "includes" : [ { + "pattern" : "\\QMETA-INF/services/ch.qos.logback.classic.spi.Configurator\\E" + }, { + "pattern" : "\\QMETA-INF/services/java.lang.System$LoggerFinder\\E" + }, { + "pattern" : "\\QMETA-INF/services/java.net.spi.InetAddressResolverProvider\\E" + }, { + "pattern" : "\\QMETA-INF/services/java.net.spi.URLStreamHandlerProvider\\E" + }, { + "pattern" : "\\QMETA-INF/services/java.nio.channels.spi.SelectorProvider\\E" + }, { + "pattern" : "\\QMETA-INF/services/java.time.zone.ZoneRulesProvider\\E" + }, { + "pattern" : "\\QMETA-INF/services/javax.xml.parsers.SAXParserFactory\\E" + }, { + "pattern" : "\\QMETA-INF/services/org.slf4j.spi.SLF4JServiceProvider\\E" + }, { + "pattern" : "\\Qlogback-test.scmo\\E" + }, { + "pattern" : "\\Qlogback-test.xml\\E" + }, { + "pattern" : "\\Qlogback.scmo\\E" + }, { + "pattern" : "\\Qlogback.xml\\E" + }, { + "pattern" : "java.base:\\Qjdk/internal/icu/impl/data/icudt72b/uprops.icu\\E" + }, { + "pattern" : "java.base:\\Qsun/net/idn/uidna.spp\\E" + }, { + "pattern" : "\\QMETA-INF/services/java.util.spi.ResourceBundleControlProvider\\E" + }, { + "pattern" : "\\QMETA-INF/services/org.eclipse.jetty.http.HttpFieldPreEncoder\\E" + }, { + "pattern" : "\\Qorg/eclipse/jetty/http/encoding.properties\\E" + }, { + "pattern" : "\\Qorg/eclipse/jetty/http/mime.properties\\E" + }, { + "pattern" : "\\Qorg/eclipse/jetty/version/build.properties\\E" + } ] + } +} \ No newline at end of file diff --git a/run/src/main/resources/META-INF/native-image/serialization-config.json b/run/src/main/resources/META-INF/native-image/serialization-config.json new file mode 100644 index 0000000..68eba83 --- /dev/null +++ b/run/src/main/resources/META-INF/native-image/serialization-config.json @@ -0,0 +1,5 @@ +{ + "lambdaCapturingTypes" : [ ], + "proxies" : [ ], + "types" : [ ] +} \ No newline at end of file diff --git a/run/src/main/resources/log4j2.xml b/run/src/main/resources/log4j2.xml deleted file mode 100644 index a4664de..0000000 --- a/run/src/main/resources/log4j2.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - %d{MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n - - - - - - - - - - - - - - - - - - diff --git a/run/src/main/resources/logback.xml b/run/src/main/resources/logback.xml new file mode 100644 index 0000000..3b2f1ab --- /dev/null +++ b/run/src/main/resources/logback.xml @@ -0,0 +1,37 @@ + + + + + + + + + + logs/${LOG_FILE_NAME}.log + + + logs/${LOG_FILE_NAME}.%d{yyyy-MM-dd}.log + + 30 + + + ${LOG_PATTERN} + + + + + + + ${LOG_PATTERN} + + + + + + + + + + + + diff --git a/common/src/test/java/nettytest/NettyClient.java b/run/src/test/java/nettytest/NettyClient.java similarity index 100% rename from common/src/test/java/nettytest/NettyClient.java rename to run/src/test/java/nettytest/NettyClient.java diff --git a/common/src/test/java/nettytest/NettyServer.java b/run/src/test/java/nettytest/NettyServer.java similarity index 100% rename from common/src/test/java/nettytest/NettyServer.java rename to run/src/test/java/nettytest/NettyServer.java diff --git a/common/src/test/java/org/wowtools/hppt/common/client/ClientSessionManagerTest.java b/run/src/test/java/org/wowtools/hppt/common/client/ClientSessionManagerTest.java similarity index 100% rename from common/src/test/java/org/wowtools/hppt/common/client/ClientSessionManagerTest.java rename to run/src/test/java/org/wowtools/hppt/common/client/ClientSessionManagerTest.java diff --git a/common/src/test/java/org/wowtools/hppt/common/server/ServerSessionManagerTest.java b/run/src/test/java/org/wowtools/hppt/common/server/ServerSessionManagerTest.java similarity index 95% rename from common/src/test/java/org/wowtools/hppt/common/server/ServerSessionManagerTest.java rename to run/src/test/java/org/wowtools/hppt/common/server/ServerSessionManagerTest.java index b21194f..81fc712 100644 --- a/common/src/test/java/org/wowtools/hppt/common/server/ServerSessionManagerTest.java +++ b/run/src/test/java/org/wowtools/hppt/common/server/ServerSessionManagerTest.java @@ -1,4 +1,4 @@ -//package org.wowtools.hppt.common.server; +package org.wowtools.hppt.common.server;//package org.wowtools.hppt.common.server; // // //import java.nio.charset.StandardCharsets; diff --git a/common/src/test/java/org/wowtools/hppt/common/util/AesCipherUtilTest.java b/run/src/test/java/org/wowtools/hppt/common/util/AesCipherUtilTest.java similarity index 100% rename from common/src/test/java/org/wowtools/hppt/common/util/AesCipherUtilTest.java rename to run/src/test/java/org/wowtools/hppt/common/util/AesCipherUtilTest.java diff --git a/common/src/test/java/org/wowtools/hppt/common/util/BytesUtilTest.java b/run/src/test/java/org/wowtools/hppt/common/util/BytesUtilTest.java similarity index 100% rename from common/src/test/java/org/wowtools/hppt/common/util/BytesUtilTest.java rename to run/src/test/java/org/wowtools/hppt/common/util/BytesUtilTest.java diff --git a/common/src/test/java/org/wowtools/hppt/common/util/GridAesCipherUtilTest.java b/run/src/test/java/org/wowtools/hppt/common/util/GridAesCipherUtilTest.java similarity index 100% rename from common/src/test/java/org/wowtools/hppt/common/util/GridAesCipherUtilTest.java rename to run/src/test/java/org/wowtools/hppt/common/util/GridAesCipherUtilTest.java diff --git a/run/src/test/java/org/wowtools/hppt/run/ss/post/CombinedServer.java b/run/src/test/java/org/wowtools/hppt/run/ss/post/CombinedServer.java new file mode 100644 index 0000000..720ff9f --- /dev/null +++ b/run/src/test/java/org/wowtools/hppt/run/ss/post/CombinedServer.java @@ -0,0 +1,173 @@ +package org.wowtools.hppt.run.ss.post; + +import io.netty.bootstrap.ServerBootstrap; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.http.*; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import lombok.extern.slf4j.Slf4j; +import org.wowtools.hppt.common.util.BytesUtil; + +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +@Slf4j +public final class CombinedServer { + + private final PostServerSessionService postServerSessionService; + private final long waitResponseTime; + private final long replyDelayTime; + + public CombinedServer(PostServerSessionService postServerSessionService, long waitResponseTime, long replyDelayTime) { + this.postServerSessionService = postServerSessionService; + this.waitResponseTime = waitResponseTime; + this.replyDelayTime = replyDelayTime; + } + + public void start(int port) throws InterruptedException { + EventLoopGroup bossGroup = new NioEventLoopGroup(1); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + + try { + ServerBootstrap b = new ServerBootstrap(); + b.group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .handler(new LoggingHandler(LogLevel.INFO)) + .childHandler(new ChannelInitializer() { + @Override + public void initChannel(SocketChannel ch) { + ChannelPipeline p = ch.pipeline(); + p.addLast(new HttpServerCodec()); + p.addLast(new HttpObjectAggregator(65536)); + p.addLast(new CombinedServerHandler(postServerSessionService, waitResponseTime, replyDelayTime)); + } + }); + + Channel ch = b.bind(port).sync().channel(); + + log.info("Netty combined server started on port {}", port); + + ch.closeFuture().sync(); + } finally { + bossGroup.shutdownGracefully(); + workerGroup.shutdownGracefully(); + } + } + + public static void main(String[] args) throws InterruptedException { + PostServerSessionService postServerSessionService = null; + long waitResponseTime = 5000L; // example value + long replyDelayTime = 100L; // example value + new CombinedServer(postServerSessionService, waitResponseTime, replyDelayTime).start(8888); + } + + @Slf4j + private static class CombinedServerHandler extends SimpleChannelInboundHandler { + + private final PostServerSessionService postServerSessionService; + private final long waitResponseTime; + private final long replyDelayTime; + + public CombinedServerHandler(PostServerSessionService postServerSessionService, long waitResponseTime, long replyDelayTime) { + this.postServerSessionService = postServerSessionService; + this.waitResponseTime = waitResponseTime; + this.replyDelayTime = replyDelayTime; + } + + @Override + protected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest req) throws Exception { + String uri = req.uri(); + if (uri.startsWith("/s")) { + handleSend(ctx, req); + } else if (uri.startsWith("/r")) { + handleReply(ctx, req); + } else { + sendResponse(ctx, req, HttpResponseStatus.NOT_FOUND); + } + } + + private void handleSend(ChannelHandlerContext ctx, FullHttpRequest req) throws Exception { + if (req.method() == HttpMethod.POST) { + String cookie = req.uri().substring(req.uri().indexOf("c=") + 2); + PostCtx postCtx = postServerSessionService.ctxMap.computeIfAbsent(cookie, PostCtx::new); + receive(postCtx, req); + sendResponse(ctx, req, HttpResponseStatus.OK); + } else { + sendResponse(ctx, req, HttpResponseStatus.METHOD_NOT_ALLOWED); + } + } + + private void handleReply(ChannelHandlerContext ctx, FullHttpRequest req) throws Exception { + if (req.method() == HttpMethod.POST) { + String cookie = req.uri().substring(req.uri().indexOf("c=") + 2); + PostCtx postCtx = postServerSessionService.ctxMap.get(cookie); + if (postCtx != null) { + write(postCtx, ctx, req); + } else { + sendResponse(ctx, req, HttpResponseStatus.NO_CONTENT); + } + } else { + sendResponse(ctx, req, HttpResponseStatus.METHOD_NOT_ALLOWED); + } + } + + private void receive(PostCtx postCtx, FullHttpRequest req) { + ByteBuf content = req.content(); + byte[] bytes = new byte[content.readableBytes()]; + content.readBytes(bytes); + + log.debug("Received request body {}", bytes.length); + + List bytesList = BytesUtil.pbBytes2BytesList(bytes); + for (byte[] sub : bytesList) { + postServerSessionService.receiveClientBytes(postCtx, sub); + } + } + + private void write(PostCtx postCtx, ChannelHandlerContext ctx, FullHttpRequest req) throws Exception { + if (replyDelayTime > 0) { + Thread.sleep(replyDelayTime); + } + + List bytesList = new LinkedList<>(); + byte[] rBytes = postCtx.sendQueue.poll(waitResponseTime, TimeUnit.MILLISECONDS); + if (rBytes == null) { + sendResponse(ctx, req, HttpResponseStatus.NO_CONTENT); + return; + } + bytesList.add(rBytes); + + postCtx.sendQueue.drainTo(bytesList); + rBytes = BytesUtil.bytesCollection2PbBytes(bytesList); + log.debug("Sending bytes to client bytesList {} body {}", bytesList.size(), rBytes.length); + + FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, Unpooled.wrappedBuffer(rBytes)); + response.headers().set(HttpHeaderNames.CONTENT_TYPE, "application/octet-stream"); + response.headers().set(HttpHeaderNames.CONTENT_LENGTH, rBytes.length); + ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE); + } + + private void sendResponse(ChannelHandlerContext ctx, FullHttpRequest req, HttpResponseStatus status) { + FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, status); + response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain; charset=UTF-8"); + response.headers().set(HttpHeaderNames.CONTENT_LENGTH, 0); + if (HttpUtil.isKeepAlive(req)) { + response.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE); + } + + ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { + log.error("Error handling request", cause); + ctx.close(); + } + } +} diff --git a/common/src/test/java/t1/BytesCallBack.java b/run/src/test/java/t1/BytesCallBack.java similarity index 100% rename from common/src/test/java/t1/BytesCallBack.java rename to run/src/test/java/t1/BytesCallBack.java diff --git a/common/src/test/java/t1/ClientPort.java b/run/src/test/java/t1/ClientPort.java similarity index 100% rename from common/src/test/java/t1/ClientPort.java rename to run/src/test/java/t1/ClientPort.java diff --git a/common/src/test/java/t1/ClientSession.java b/run/src/test/java/t1/ClientSession.java similarity index 100% rename from common/src/test/java/t1/ClientSession.java rename to run/src/test/java/t1/ClientSession.java diff --git a/common/src/test/java/t1/ClientSessionManager.java b/run/src/test/java/t1/ClientSessionManager.java similarity index 100% rename from common/src/test/java/t1/ClientSessionManager.java rename to run/src/test/java/t1/ClientSessionManager.java diff --git a/common/src/test/java/t1/ServerPort.java b/run/src/test/java/t1/ServerPort.java similarity index 100% rename from common/src/test/java/t1/ServerPort.java rename to run/src/test/java/t1/ServerPort.java diff --git a/common/src/test/java/t1/ServerSession.java b/run/src/test/java/t1/ServerSession.java similarity index 100% rename from common/src/test/java/t1/ServerSession.java rename to run/src/test/java/t1/ServerSession.java diff --git a/common/src/test/java/t1/ServerSessionManager.java b/run/src/test/java/t1/ServerSessionManager.java similarity index 100% rename from common/src/test/java/t1/ServerSessionManager.java rename to run/src/test/java/t1/ServerSessionManager.java diff --git a/common/src/test/java/t1/SessionBytes.java b/run/src/test/java/t1/SessionBytes.java similarity index 100% rename from common/src/test/java/t1/SessionBytes.java rename to run/src/test/java/t1/SessionBytes.java diff --git a/common/src/test/java/t1/Test.java b/run/src/test/java/t1/Test.java similarity index 100% rename from common/src/test/java/t1/Test.java rename to run/src/test/java/t1/Test.java diff --git a/common/src/test/java/test/ByteArrayCompressionExample.java b/run/src/test/java/test/ByteArrayCompressionExample.java similarity index 100% rename from common/src/test/java/test/ByteArrayCompressionExample.java rename to run/src/test/java/test/ByteArrayCompressionExample.java diff --git a/common/src/test/java/test/LZ4CompressionExample.java b/run/src/test/java/test/LZ4CompressionExample.java similarity index 100% rename from common/src/test/java/test/LZ4CompressionExample.java rename to run/src/test/java/test/LZ4CompressionExample.java diff --git a/common/src/test/java/test/ReadYmlConfig.java b/run/src/test/java/test/ReadYmlConfig.java similarity index 95% rename from common/src/test/java/test/ReadYmlConfig.java rename to run/src/test/java/test/ReadYmlConfig.java index eae46d5..9d2c65f 100644 --- a/common/src/test/java/test/ReadYmlConfig.java +++ b/run/src/test/java/test/ReadYmlConfig.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; -import org.wowtools.common.utils.ResourcesReader; +import org.wowtools.hppt.common.util.ResourcesReader; /** * @author liuyu diff --git a/common/src/test/java/test/SimpleNettyClient.java b/run/src/test/java/test/SimpleNettyClient.java similarity index 100% rename from common/src/test/java/test/SimpleNettyClient.java rename to run/src/test/java/test/SimpleNettyClient.java diff --git a/common/src/test/java/test/SimpleNettyServer.java b/run/src/test/java/test/SimpleNettyServer.java similarity index 100% rename from common/src/test/java/test/SimpleNettyServer.java rename to run/src/test/java/test/SimpleNettyServer.java diff --git a/common/src/test/java/test/SymmetricEncryptionExample.java b/run/src/test/java/test/SymmetricEncryptionExample.java similarity index 100% rename from common/src/test/java/test/SymmetricEncryptionExample.java rename to run/src/test/java/test/SymmetricEncryptionExample.java diff --git a/common/src/test/java/test/TCPForwardingServer.java b/run/src/test/java/test/TCPForwardingServer.java similarity index 100% rename from common/src/test/java/test/TCPForwardingServer.java rename to run/src/test/java/test/TCPForwardingServer.java