diff --git a/src/core/pom.xml b/src/core/pom.xml
index 159f42e8..ca9fbbce 100644
--- a/src/core/pom.xml
+++ b/src/core/pom.xml
@@ -1,3 +1,4 @@
+
@@ -8,7 +9,7 @@
org.t-io
tio-parent
- 3.7.0.v20201010-RELEASE
+ 3.7.5.v20211028-RELEASE
../parent/pom.xml
@@ -18,7 +19,6 @@
tio-utils
-
org.redisson
redisson
diff --git a/src/core/src/main/java/org/tio/core/ssl/facade/SSLFacade.java b/src/core/src/main/java/org/tio/core/ssl/facade/SSLFacade.java
index 754cfa89..293a60ec 100644
--- a/src/core/src/main/java/org/tio/core/ssl/facade/SSLFacade.java
+++ b/src/core/src/main/java/org/tio/core/ssl/facade/SSLFacade.java
@@ -205,29 +205,21 @@ recommend that a file or class name and description of purpose be included on
import org.slf4j.LoggerFactory;
import org.tio.core.ChannelContext;
import org.tio.core.ssl.SslVo;
+import org.tio.core.utils.ByteBufferUtils;
-/**
- * 一个
- * @author tanyaowu
- *
- */
public class SSLFacade implements ISSLFacade {
@SuppressWarnings("unused")
- private static final String TAG = "SSLFascade";
- private static final Logger log = LoggerFactory.getLogger(SSLFacade.class);
-
+ private static final String TAG = "SSLFascade";
+ private static final Logger log = LoggerFactory.getLogger(SSLFacade.class);
private AtomicLong sslSeq = new AtomicLong();
-
- private Handshaker _handshaker;
- private IHandshakeCompletedListener _hcl;
- private final Worker _worker;
- private boolean _clientMode;
- private ChannelContext channelContext;
+ private Handshaker _handshaker;
+ private IHandshakeCompletedListener _hcl;
+ private final Worker _worker;
+ private boolean _clientMode;
+ private ChannelContext channelContext;
public SSLFacade(ChannelContext channelContext, SSLContext context, boolean client, boolean clientAuthRequired, ITaskHandler taskHandler) {
this.channelContext = channelContext;
- //Currently there is no support for SSL session reuse,
- // so no need to take a peerHost or port from the host application
final String who = client ? "client" : "server";
SSLEngine engine = makeSSLEngine(context, client, clientAuthRequired);
Buffers buffers = new Buffers(engine.getSession(), channelContext);
@@ -236,10 +228,6 @@ public SSLFacade(ChannelContext channelContext, SSLContext context, boolean clie
_clientMode = client;
}
- // private void debug(final String message, final String... args) {
- // SSLLog.debug(TAG, message, args);
- // }
-
@Override
public boolean isClientMode() {
return _clientMode;
@@ -276,7 +264,7 @@ public void encrypt(SslVo sslVo) throws SSLException {
long seq = sslSeq.incrementAndGet();
ByteBuffer src = sslVo.getByteBuffer();
- ByteBuffer[] byteBuffers = org.tio.core.utils.ByteBufferUtils.split(src, 1024 * 8);
+ ByteBuffer[] byteBuffers = ByteBufferUtils.split(src, 2048);
if (byteBuffers == null) {
log.debug("{}, 准备, SSL加密{}, 明文:{}", channelContext, channelContext.getId() + "_" + seq, sslVo);
SSLEngineResult result = _worker.wrap(sslVo, sslVo.getByteBuffer());
diff --git a/src/core/src/main/java/org/tio/core/task/DecodeRunnable.java b/src/core/src/main/java/org/tio/core/task/DecodeRunnable.java
index 03cad164..aa68131e 100644
--- a/src/core/src/main/java/org/tio/core/task/DecodeRunnable.java
+++ b/src/core/src/main/java/org/tio/core/task/DecodeRunnable.java
@@ -204,7 +204,7 @@ recommend that a file or class name and description of purpose be included on
import org.tio.core.ChannelContext.CloseCode;
import org.tio.core.Tio;
import org.tio.core.TioConfig;
-import org.tio.core.exception.AioDecodeException;
+import org.tio.core.exception.TioDecodeException;
import org.tio.core.intf.Packet;
import org.tio.core.stat.ChannelStat;
import org.tio.core.stat.IpStat;
@@ -346,7 +346,7 @@ public void decode() {
int per = readableLength / channelStat.decodeFailCount;
if (per < Math.min(channelContext.getReadBufferSize() / 2, 256)) {
String str = "连续解码" + channelStat.decodeFailCount + "次都不成功,并且平均每次接收到的数据为" + per + "字节,有慢攻击的嫌疑";
- throw new AioDecodeException(str);
+ throw new TioDecodeException(str);
}
}
}
@@ -413,7 +413,7 @@ public void decode() {
channelContext.setPacketNeededLength(null);
- if (e instanceof AioDecodeException) {
+ if (e instanceof TioDecodeException) {
List list = tioConfig.ipStats.durationList;
if (list != null && list.size() > 0) {
try {
diff --git a/src/core/src/main/java/org/tio/core/utils/ByteBufferUtils.java b/src/core/src/main/java/org/tio/core/utils/ByteBufferUtils.java
index 69810f90..0d4794cc 100644
--- a/src/core/src/main/java/org/tio/core/utils/ByteBufferUtils.java
+++ b/src/core/src/main/java/org/tio/core/utils/ByteBufferUtils.java
@@ -195,6 +195,7 @@ recommend that a file or class name and description of purpose be included on
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -482,6 +483,34 @@ public static String readString(ByteBuffer buffer, String charset, char endChar,
return null;
}
+ /**
+ * 获取utf-8字符串
+ * @param bytes
+ * @return
+ *
+ */
+ public static String getUtf8(byte[] bytes) {
+ return new String(bytes, StandardCharsets.UTF_8);
+ }
+
+ /**
+ * 读取byte
+ * @param buffer
+ * @return
+ */
+ public static byte read(ByteBuffer buffer) {
+ return buffer.get();
+ }
+
+ /**
+ * 读取short
+ * @param buffer
+ * @return
+ */
+ public static short readShort(ByteBuffer buffer) {
+ return buffer.getShort();
+ }
+
public static int readUB1(ByteBuffer buffer) {
int ret = buffer.get() & 0xff;
return ret;
diff --git a/src/core/src/main/java/org/tio/server/ServerTioConfig.java b/src/core/src/main/java/org/tio/server/ServerTioConfig.java
index 0ac403e6..0c24cb4a 100644
--- a/src/core/src/main/java/org/tio/server/ServerTioConfig.java
+++ b/src/core/src/main/java/org/tio/server/ServerTioConfig.java
@@ -514,6 +514,7 @@ public void share(ServerTioConfig tioConfig) {
this.clientNodes = tioConfig.clientNodes;
this.connections = tioConfig.connections;
this.groups = tioConfig.groups;
+ this.groupStat = tioConfig.groupStat;
this.users = tioConfig.users;
this.tokens = tioConfig.tokens;
this.ids = tioConfig.ids;
diff --git a/src/core/src/main/java/org/tio/server/TioServer.java b/src/core/src/main/java/org/tio/server/TioServer.java
index 81083e29..6025e4d3 100644
--- a/src/core/src/main/java/org/tio/server/TioServer.java
+++ b/src/core/src/main/java/org/tio/server/TioServer.java
@@ -194,16 +194,12 @@ recommend that a file or class name and description of purpose be included on
package org.tio.server;
import java.io.IOException;
-import java.io.InputStream;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
-import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.StandardSocketOptions;
-import java.net.URL;
import java.nio.channels.AsynchronousChannelGroup;
import java.nio.channels.AsynchronousServerSocketChannel;
-import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -212,7 +208,6 @@ recommend that a file or class name and description of purpose be included on
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tio.core.Node;
-import org.tio.utils.IoUtils;
import org.tio.utils.SysConst;
import org.tio.utils.hutool.DateUtil;
import org.tio.utils.hutool.StrUtil;
@@ -353,8 +348,6 @@ public void start(String serverIp, int serverPort) throws IOException {
} else {
System.out.println(printStr);
}
-
- checkLastVersion();
}
/**
@@ -401,63 +394,6 @@ public boolean stop() {
return ret;
}
- private void checkLastVersion() {
- if (checkLastVersion) {
- serverTioConfig.groupExecutor.execute(new Runnable() {
- @Override
- public void run() {
- try {
- URL url = new URL(SysConst.CHECK_LASTVERSION_URL_1);
- HttpURLConnection connection = (HttpURLConnection) url.openConnection();
- connection.setRequestMethod("GET");
- connection.setConnectTimeout(10 * 1000);
- connection.connect();
- int responseCode = connection.getResponseCode();
- if (responseCode == HttpURLConnection.HTTP_OK) {
- InputStream inputStream = connection.getInputStream();
- String result = IoUtils.streamToString(inputStream);
-
- connection.disconnect();
-
- url = new URL(SysConst.CHECK_LASTVERSION_URL_2 + result);
- connection = (HttpURLConnection) url.openConnection();
- connection.setRequestMethod("GET");
- connection.setConnectTimeout(10 * 1000);
- connection.connect();
- responseCode = connection.getResponseCode();
- if (responseCode == HttpURLConnection.HTTP_OK) {
- inputStream = connection.getInputStream();
- result = IoUtils.streamToString(inputStream);
-
- if (SysConst.TIO_CORE_VERSION.equals(result)) {
- log.info("The version you are using is the latest");
- } else {
- log.info("t-io latest version:{},your version:{}", result, SysConst.TIO_CORE_VERSION);
- //3.6.2.v20200808-RELEASE
- String myVersionDateStr = SysConst.TIO_CORE_VERSION.substring(SysConst.TIO_CORE_VERSION.length() - 16, SysConst.TIO_CORE_VERSION.length() - 8);
- String latestVersionDateStr = result.substring(result.length() - 16, result.length() - 8);
-
- SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
-
- Date myVersionDate = format.parse(myVersionDateStr);
- Date latestVersionDate = format.parse(latestVersionDateStr);
- Integer days = DateUtil.daysBetween(myVersionDate, latestVersionDate);
-
- log.info("You haven't upgraded in {} days", days);
- }
- }
-
- connection.disconnect();
-
- }
- } catch (Exception e) {
- // log.error("", e);
- }
- }
- });
- }
- }
-
public boolean isCheckLastVersion() {
return checkLastVersion;
}
diff --git a/src/parent/pom.xml b/src/parent/pom.xml
index be132146..6e0b7a5c 100644
--- a/src/parent/pom.xml
+++ b/src/parent/pom.xml
@@ -1,3 +1,4 @@
+
@@ -5,7 +6,7 @@
org.t-io
tio-parent
pom
- 3.7.0.v20201010-RELEASE
+ 3.7.5.v20211028-RELEASE
${project.artifactId}
http://maven.apache.org
@@ -35,44 +36,44 @@
3.1.0
- 3.7.0.v20201010-RELEASE
+ 3.7.5.v20211028-RELEASE
UTF-8
UTF-8
true
3.6.0
- 8.0.21
- 1.2.1
- 3.4.5
+ 8.0.23
+ 1.2.8
+ 4.0.3
4.9
1.2.3
1.7.26
1.8
- 4.13
+ 4.13.1
4.4
- 2.8.0
- 3.11
+ 2.11.0
+ 3.12.0
1.15
- 1.20
- 1.2.74
- 7.3.0
- 5.4.4
+ 1.21
+ 1.2.78
+ 7.4.0
+ 5.7.15
3.12.2
1.9.4
1.4
- 1.7.2
- 3.13.5
+ 1.7.4
+ 3.16.3
5.1.6
2.3.2
- 2.8.5
- 3.9.0
+ 2.9.0
+ 4.1.5.B
3.4.1
- 4.4.13
+ 4.4.14
4.5.13
- v20201006
- 2.3.30
+ v20211006
+ 2.3.31
1.21
- 7.1.1
+ 8.3.1
1.0.2
@@ -97,21 +98,22 @@
4.1-${javacpp.version}
4.0.1-${javacpp.version}
- 2.7
+ 2.7.9
3.1.0
- 1.10.1
+ 1.10.3
6.2.2
4.9.0
- 3.2.12
- 2.7.0
- 3.12.7
+ 3.2.25
+ 2.8.3
+ 3.12.10
2.2.7.RELEASE
- 5.6.0
- 5.3.0
+ 5.9.0
+ 5.8.3
+ 5.0.0
@@ -128,11 +130,35 @@
+
+ org.openjfx
+ javafx-controls
+ 18-ea+1
+
+
+
+ me.zhyd.oauth
+ JustAuth
+ 1.16.5
+
+
org.mapdb
mapdb
3.0.8
+
+
+ cglib
+ cglib
+ 3.3.0
+
+
+ org.ow2.asm
+ asm
+ 9.2
+
+
com.github.oshi
oshi-core
@@ -202,6 +228,14 @@
${tio.version}
+
+
+ org.t-io
+ tio-clu-server
+ ${tio.version}
+
+
+
org.t-io
tio-umeng
@@ -223,7 +257,7 @@
commons-net
commons-net
- 3.7.1
+ 3.8.0
@@ -367,7 +401,11 @@
-
+
+ org.apache.logging.log4j
+ log4j-api
+ 2.14.1
+
@@ -468,7 +506,7 @@
org.json
json
- 20200518
+ 20210307
@@ -491,7 +529,7 @@
org.jsoup
jsoup
- 1.13.1
+ 1.14.3
@@ -503,13 +541,13 @@
com.google.guava
guava
- 29.0-jre
+ 31.0.1-jre
nl.basjes.parse.useragent
yauaa
- 5.19
+ 6.0
@@ -542,7 +580,7 @@
com.typesafe
config
- 1.4.0
+ 1.4.1
@@ -588,7 +626,7 @@
io.github.classgraph
classgraph
- 4.8.90
+ 4.8.128
com.thoughtworks.paranamer
@@ -610,17 +648,17 @@
org.mongodb
bson
- 4.0.0
+ 4.3.1
org.mongodb
mongodb-driver-core
- 4.0.0
+ 4.3.1
org.mongodb
mongodb-driver-reactivestreams
- 4.0.0
+ 4.3.1
@@ -650,17 +688,17 @@
com.aliyun
aliyun-java-sdk-core
- 3.7.1
+ 4.5.25
com.aliyun
aliyun-java-sdk-live
- 3.6.0
+ 3.9.11
com.aliyun.oss
aliyun-sdk-oss
- 3.1.0
+ 3.13.1
@@ -730,13 +768,13 @@
org.apache.curator
curator-x-discovery
- 5.1.0
+ 5.2.0
org.apache.zookeeper
zookeeper
- 3.6.2
+ 3.7.0
@@ -789,13 +827,13 @@
com.esotericsoftware
kryo
- 5.0.0-RC5
+ 5.2.0
io.netty
netty-bom
- 4.1.50.Final
+ 4.1.63.Final
pom
import
@@ -819,7 +857,7 @@
com.github.hazendaz
htmlcompressor
- 1.7.1
+ 1.7.2
@@ -860,7 +898,7 @@
io.reactivex.rxjava2
rxjava
- 2.2.20
+ 2.2.21
@@ -928,13 +966,13 @@
net.coobird
thumbnailator
- 0.4.12
+ 0.4.14
com.lmax
disruptor
- 3.4.2
+ 3.4.4
@@ -943,29 +981,29 @@
2.5.1
-
+
net.bytebuddy
byte-buddy
- 1.10.17
+ 1.11.21
io.projectreactor
reactor-core
- 3.3.10.RELEASE
+ 3.4.11
com.google.code.gson
gson
- 2.8.6
+ 2.8.8
cn.jpush.api
jpush-client
- 3.4.7
+ 3.5.4
@@ -1043,18 +1081,48 @@
org.webjars
webjars-locator-core
- 0.46
+ 0.48
redis.clients
jedis
- 3.3.0
+ 3.7.0
com.couchbase.client
java-client
- 3.0.9
+ 3.2.0
+
+
+
+ org.elasticsearch.client
+ elasticsearch-rest-high-level-client
+ 7.13.0
+
+
+
+
+
+
+ org.apache.poi
+ poi
+ ${poi.version}
+
+
+ org.apache.poi
+ poi-scratchpad
+ ${poi.version}
+
+
+ fr.opensagres.xdocreport
+ fr.opensagres.xdocreport.document
+ 2.0.2
+
+
+ fr.opensagres.xdocreport
+ org.apache.poi.xwpf.converter.xhtml
+ 1.0.6
diff --git a/src/utils/pom.xml b/src/utils/pom.xml
index 8d83ef21..abd16fa9 100644
--- a/src/utils/pom.xml
+++ b/src/utils/pom.xml
@@ -1,3 +1,4 @@
+
@@ -8,7 +9,7 @@
org.t-io
tio-parent
- 3.7.0.v20201010-RELEASE
+ 3.7.5.v20211028-RELEASE
../parent/pom.xml
diff --git a/src/utils/src/main/java/org/tio/utils/SysConst.java b/src/utils/src/main/java/org/tio/utils/SysConst.java
index df917aa5..0b743485 100644
--- a/src/utils/src/main/java/org/tio/utils/SysConst.java
+++ b/src/utils/src/main/java/org/tio/utils/SysConst.java
@@ -200,7 +200,7 @@ recommend that a file or class name and description of purpose be included on
* 2018年7月1日 下午10:51:59
*/
public interface SysConst {
- String TIO_CORE_VERSION = "3.7.0.v20201010-RELEASE";
+ String TIO_CORE_VERSION = "3.7.5.v20211028-RELEASE";
String TIO_URL_GITEE = "https://gitee.com/tywo45/t-io";
String TIO_URL_GITHUB = "https://github.com/tywo45/t-io";
String TIO_URL_SITE = "https://www.tiocloud.com";
diff --git a/src/zoo/flash-policy-server/pom.xml b/src/zoo/flash-policy-server/pom.xml
index 7777bd98..a21288ed 100644
--- a/src/zoo/flash-policy-server/pom.xml
+++ b/src/zoo/flash-policy-server/pom.xml
@@ -1,3 +1,4 @@
+
@@ -8,7 +9,7 @@
org.t-io
tio-parent
- 3.7.0.v20201010-RELEASE
+ 3.7.5.v20211028-RELEASE
../../parent/pom.xml
diff --git a/src/zoo/http/client/pom.xml b/src/zoo/http/client/pom.xml
index 8a076f7c..a6471e03 100644
--- a/src/zoo/http/client/pom.xml
+++ b/src/zoo/http/client/pom.xml
@@ -1,3 +1,4 @@
+
@@ -8,7 +9,7 @@
org.t-io
tio-http-parent
- 3.7.0.v20201010-RELEASE
+ 3.7.5.v20211028-RELEASE
../parent/pom.xml
diff --git a/src/zoo/http/common/pom.xml b/src/zoo/http/common/pom.xml
index cbac8514..e134f2ee 100644
--- a/src/zoo/http/common/pom.xml
+++ b/src/zoo/http/common/pom.xml
@@ -1,3 +1,4 @@
+
4.0.0
@@ -7,7 +8,7 @@
org.t-io
tio-http-parent
- 3.7.0.v20201010-RELEASE
+ 3.7.5.v20211028-RELEASE
../parent/pom.xml
diff --git a/src/zoo/http/common/src/main/java/org/tio/http/common/HeaderName.java b/src/zoo/http/common/src/main/java/org/tio/http/common/HeaderName.java
index fb7199dc..48191643 100644
--- a/src/zoo/http/common/src/main/java/org/tio/http/common/HeaderName.java
+++ b/src/zoo/http/common/src/main/java/org/tio/http/common/HeaderName.java
@@ -232,6 +232,7 @@ public class HeaderName {
public static final HeaderName tio_from_cache = new HeaderName(HttpConst.ResponseHeaderKey.tio_from_cache);
public static final HeaderName tio_webpack_used_cache = new HeaderName(HttpConst.ResponseHeaderKey.tio_webpack_used_cache);
public static final HeaderName Access_Control_Allow_Credentials = new HeaderName(HttpConst.ResponseHeaderKey.Access_Control_Allow_Credentials);
+ public static final HeaderName Sec_Websocket_Protocol = HeaderName.from(HttpConst.RequestHeaderKey.Sec_Websocket_Protocol);
public final String name;
diff --git a/src/zoo/http/common/src/main/java/org/tio/http/common/HttpConst.java b/src/zoo/http/common/src/main/java/org/tio/http/common/HttpConst.java
index eac9fd2d..28a2f07a 100644
--- a/src/zoo/http/common/src/main/java/org/tio/http/common/HttpConst.java
+++ b/src/zoo/http/common/src/main/java/org/tio/http/common/HttpConst.java
@@ -255,6 +255,8 @@ public interface RequestHeaderKey {
* 值为XMLHttpRequest则为Ajax
*/
String X_Requested_With = "x-requested-with";//.toLowerCase();//XMLHttpRequest
+
+ String Sec_Websocket_Protocol = "sec-websocket-protocol"; //.toLowerCase(); // websocket 子协议
}
// Content-Type: text/html;charset:utf-8;
diff --git a/src/zoo/http/common/src/main/java/org/tio/http/common/RequestLine.java b/src/zoo/http/common/src/main/java/org/tio/http/common/RequestLine.java
index 81c4805a..eb0d1724 100644
--- a/src/zoo/http/common/src/main/java/org/tio/http/common/RequestLine.java
+++ b/src/zoo/http/common/src/main/java/org/tio/http/common/RequestLine.java
@@ -232,7 +232,7 @@ public String getPath() {
*/
public String getPathAndQuery() {
if (StrUtil.isNotBlank(queryString)) {
- return path + "?" + queryString;
+ return path + '?' + queryString;
}
return path;
}
@@ -327,12 +327,12 @@ public void setInitPath(String initPath) {
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
- sb.append(method.value).append(" ").append(path);
+ sb.append(method.value).append(' ').append(path);
if (StrUtil.isNotBlank(queryString)) {
- sb.append("?").append(queryString);
+ sb.append('?').append(queryString);
}
- sb.append(" ");
- sb.append(protocol).append("/").append(version);
+ sb.append(' ');
+ sb.append(protocol).append('/').append(version);
return sb.toString();
}
@@ -346,9 +346,9 @@ public String toString() {
@SuppressWarnings("deprecation")
public String toUrlEncodedString(String charset) {
StringBuilder sb = new StringBuilder();
- sb.append(method.value).append(" ").append(path);
+ sb.append(method.value).append(' ').append(path);
if (StrUtil.isNotBlank(queryString)) {
- sb.append("?");//.append(queryString);
+ sb.append('?');//.append(queryString);
String[] keyValues = queryString.split("&");
int i = 0;
for (String keyValue : keyValues) {
@@ -358,21 +358,21 @@ public String toUrlEncodedString(String charset) {
String value = keyValueArray[1];
if (StrUtil.isNotBlank(charset)) {
try {
- sb.append(name).append("=").append(URLEncoder.encode(value, charset));
+ sb.append(name).append('=').append(URLEncoder.encode(value, charset));
} catch (UnsupportedEncodingException e) {
- sb.append(name).append("=").append(URLEncoder.encode(value));
+ sb.append(name).append('=').append(URLEncoder.encode(value));
}
} else {
- sb.append(name).append("=").append(URLEncoder.encode(value));
+ sb.append(name).append('=').append(URLEncoder.encode(value));
}
if (i != keyValues.length - 1)
- sb.append("&");
+ sb.append('&');
}
i++;
}
}
- sb.append(" ");
- sb.append(protocol).append("/").append(version);
+ sb.append(' ');
+ sb.append(protocol).append('/').append(version);
return sb.toString();
}
diff --git a/src/zoo/http/parent/pom.xml b/src/zoo/http/parent/pom.xml
index 8756ab37..d0037200 100644
--- a/src/zoo/http/parent/pom.xml
+++ b/src/zoo/http/parent/pom.xml
@@ -1,3 +1,4 @@
+
4.0.0
@@ -11,7 +12,7 @@
org.t-io
tio-zoo-parent
- 3.7.0.v20201010-RELEASE
+ 3.7.5.v20211028-RELEASE
../../parent/pom.xml
diff --git a/src/zoo/http/server/pom.xml b/src/zoo/http/server/pom.xml
index 280ac004..8a1389ec 100644
--- a/src/zoo/http/server/pom.xml
+++ b/src/zoo/http/server/pom.xml
@@ -1,3 +1,4 @@
+
@@ -8,7 +9,7 @@
org.t-io
tio-http-parent
- 3.7.0.v20201010-RELEASE
+ 3.7.5.v20211028-RELEASE
../parent/pom.xml
diff --git a/src/zoo/parent/pom.xml b/src/zoo/parent/pom.xml
index a4aa0fea..9e677637 100644
--- a/src/zoo/parent/pom.xml
+++ b/src/zoo/parent/pom.xml
@@ -1,3 +1,4 @@
+
4.0.0
@@ -11,7 +12,7 @@
org.t-io
tio-parent
- 3.7.0.v20201010-RELEASE
+ 3.7.5.v20211028-RELEASE
../../parent/pom.xml
diff --git a/src/zoo/webpack/core/pom.xml b/src/zoo/webpack/core/pom.xml
index ca23a6e7..cbf76e99 100644
--- a/src/zoo/webpack/core/pom.xml
+++ b/src/zoo/webpack/core/pom.xml
@@ -1,3 +1,4 @@
+
4.0.0
@@ -7,7 +8,7 @@
org.t-io
tio-webpack-parent
- 3.7.0.v20201010-RELEASE
+ 3.7.5.v20211028-RELEASE
../parent/pom.xml
diff --git a/src/zoo/webpack/parent/pom.xml b/src/zoo/webpack/parent/pom.xml
index 0b11117d..7a345038 100644
--- a/src/zoo/webpack/parent/pom.xml
+++ b/src/zoo/webpack/parent/pom.xml
@@ -1,3 +1,4 @@
+
4.0.0
@@ -20,7 +21,7 @@
org.t-io
tio-zoo-parent
- 3.7.0.v20201010-RELEASE
+ 3.7.5.v20211028-RELEASE
../../parent/pom.xml
diff --git a/src/zoo/websocket/client/pom.xml b/src/zoo/websocket/client/pom.xml
index 766ffb5c..126d88e6 100644
--- a/src/zoo/websocket/client/pom.xml
+++ b/src/zoo/websocket/client/pom.xml
@@ -9,7 +9,7 @@
org.t-io
tio-websocket-parent
- 3.7.0.v20201010-RELEASE
+ 3.7.5.v20211028-RELEASE
../parent/pom.xml
diff --git a/src/zoo/websocket/common/pom.xml b/src/zoo/websocket/common/pom.xml
index 1fe27b60..9834f087 100644
--- a/src/zoo/websocket/common/pom.xml
+++ b/src/zoo/websocket/common/pom.xml
@@ -1,3 +1,4 @@
+
@@ -8,7 +9,7 @@
org.t-io
tio-websocket-parent
- 3.7.0.v20201010-RELEASE
+ 3.7.5.v20211028-RELEASE
../parent/pom.xml
@@ -17,10 +18,6 @@
org.t-io
tio-http-common
-
- commons-codec
- commons-codec
-
junit
junit
@@ -38,4 +35,4 @@
-
\ No newline at end of file
+
diff --git a/src/zoo/websocket/parent/pom.xml b/src/zoo/websocket/parent/pom.xml
index 969530af..6415a92d 100644
--- a/src/zoo/websocket/parent/pom.xml
+++ b/src/zoo/websocket/parent/pom.xml
@@ -1,3 +1,4 @@
+
4.0.0
@@ -11,7 +12,7 @@
org.t-io
tio-zoo-parent
- 3.7.0.v20201010-RELEASE
+ 3.7.5.v20211028-RELEASE
../../parent/pom.xml
diff --git a/src/zoo/websocket/server/pom.xml b/src/zoo/websocket/server/pom.xml
index 68caa895..0ffba9d1 100644
--- a/src/zoo/websocket/server/pom.xml
+++ b/src/zoo/websocket/server/pom.xml
@@ -1,3 +1,4 @@
+
4.0.0
@@ -7,7 +8,7 @@
org.t-io
tio-websocket-parent
- 3.7.0.v20201010-RELEASE
+ 3.7.5.v20211028-RELEASE
../parent/pom.xml
diff --git a/src/zoo/websocket/server/src/main/java/org/tio/websocket/server/WsServerAioHandler.java b/src/zoo/websocket/server/src/main/java/org/tio/websocket/server/WsServerAioHandler.java
index 519cb76d..9e32de85 100644
--- a/src/zoo/websocket/server/src/main/java/org/tio/websocket/server/WsServerAioHandler.java
+++ b/src/zoo/websocket/server/src/main/java/org/tio/websocket/server/WsServerAioHandler.java
@@ -195,10 +195,7 @@ recommend that a file or class name and description of purpose be included on
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -308,7 +305,7 @@ public WsRequest decode(ByteBuffer buffer, int limit, int position, int readable
}
byte[] allBody = new byte[allBodyLength];
- Integer index = 0;
+ int index = 0;
for (WsRequest wsRequest : parts) {
System.arraycopy(wsRequest.getBody(), 0, allBody, index, wsRequest.getBody().length);
index += wsRequest.getBody().length;
@@ -336,7 +333,14 @@ public WsRequest decode(ByteBuffer buffer, int limit, int position, int readable
@Override
public ByteBuffer encode(Packet packet, TioConfig tioConfig, ChannelContext channelContext) {
- WsResponse wsResponse = (WsResponse) packet;
+ // 处理 websocket 子协议
+ WsResponse wsResponse;
+ if (packet instanceof WsResponse) {
+ wsResponse = (WsResponse) packet;
+ } else {
+ wsResponse = wsMsgHandler.encodeSubProtocol(packet, tioConfig, channelContext);
+ Objects.requireNonNull(wsResponse, "IWsMsgHandler encodeSubProtocol WsResponse is null.");
+ }
// 握手包
if (wsResponse.isHandShake()) {
@@ -350,8 +354,7 @@ public ByteBuffer encode(Packet packet, TioConfig tioConfig, ChannelContext chan
}
}
- ByteBuffer byteBuffer = WsServerEncoder.encode(wsResponse, tioConfig, channelContext);
- return byteBuffer;
+ return WsServerEncoder.encode(wsResponse, tioConfig, channelContext);
}
/** @return the httpConfig */
@@ -379,6 +382,7 @@ private WsResponse h(WsRequest websocketPacket, byte[] bytes, Opcode opcode, Cha
Object retObj = wsMsgHandler.onBytes(websocketPacket, bytes, channelContext);
String methodName = "onBytes";
wsResponse = processRetObj(retObj, methodName, channelContext);
+
return wsResponse;
} else if (opcode == Opcode.PING || opcode == Opcode.PONG) {
log.debug("收到" + opcode);
@@ -471,7 +475,7 @@ public void setHttpConfig(WsServerConfig httpConfig) {
* @return
* @author tanyaowu
*/
- public static HttpResponse updateWebSocketProtocol(HttpRequest request, ChannelContext channelContext) {
+ public HttpResponse updateWebSocketProtocol(HttpRequest request, ChannelContext channelContext) {
Map headers = request.getHeaders();
String Sec_WebSocket_Key = headers.get(HttpConst.RequestHeaderKey.Sec_WebSocket_Key);
@@ -499,9 +503,45 @@ public static HttpResponse updateWebSocketProtocol(HttpRequest request, ChannelC
respHeaders.put(HeaderName.Connection, HeaderValue.Connection.Upgrade);
respHeaders.put(HeaderName.Upgrade, HeaderValue.Upgrade.WebSocket);
respHeaders.put(HeaderName.Sec_WebSocket_Accept, HeaderValue.from(acceptKey));
+
+ // websocket 子协议协商
+ String[] supportedSubProtocols = wsMsgHandler.getSupportedSubProtocols();
+ if (supportedSubProtocols != null && supportedSubProtocols.length > 0) {
+ String requestedSubProtocols = headers.get(HttpConst.RequestHeaderKey.Sec_Websocket_Protocol);
+ String selectSubProtocol = selectSubProtocol(requestedSubProtocols, supportedSubProtocols);
+ if (selectSubProtocol != null) {
+ respHeaders.put(HeaderName.Sec_Websocket_Protocol, HeaderValue.from(selectSubProtocol));
+ }
+ }
+
httpResponse.addHeaders(respHeaders);
return httpResponse;
}
return null;
}
+
+ /**
+ * Selects the first matching supported sub protocol
+ *
+ * @param requestedSubProtocols 请求中的子协议
+ * @param subProtocols 系统支持得子协议,注意:不支持 * 通配
+ * @return First matching supported sub protocol. Null if not found.
+ */
+ private static String selectSubProtocol(String requestedSubProtocols, String[] subProtocols) {
+ if (requestedSubProtocols == null || subProtocols == null || subProtocols.length == 0) {
+ return null;
+ }
+ String[] requestedSubProtocolArray = requestedSubProtocols.split(",");
+ for (String p : requestedSubProtocolArray) {
+ String requestedSubProtocol = p.trim();
+ for (String supportedSubProtocol : subProtocols) {
+ if (requestedSubProtocol.equals(supportedSubProtocol)) {
+ return requestedSubProtocol;
+ }
+ }
+ }
+ // No match found
+ return null;
+ }
+
}
diff --git a/src/zoo/websocket/server/src/main/java/org/tio/websocket/server/handler/IWsMsgHandler.java b/src/zoo/websocket/server/src/main/java/org/tio/websocket/server/handler/IWsMsgHandler.java
index 9d5c3236..fb848249 100644
--- a/src/zoo/websocket/server/src/main/java/org/tio/websocket/server/handler/IWsMsgHandler.java
+++ b/src/zoo/websocket/server/src/main/java/org/tio/websocket/server/handler/IWsMsgHandler.java
@@ -203,7 +203,7 @@ recommend that a file or class name and description of purpose be included on
* @author tanyaowu
* 2017年7月30日 上午9:34:59
*/
-public interface IWsMsgHandler {
+public interface IWsMsgHandler extends IWsSubProtocolsMsgHandler {
/**
* 对httpResponse参数进行补充并返回,如果返回null表示不想和对方建立连接,框架会断开连接,如果返回非null,框架会把这个对象发送给对方
* 注:请不要在这个方法中向对方发送任何消息,因为这个时候握手还没完成,发消息会导致协议交互失败。
@@ -215,7 +215,7 @@ public interface IWsMsgHandler {
* @throws Exception
* @author tanyaowu
*/
- public HttpResponse handshake(HttpRequest httpRequest, HttpResponse httpResponse, ChannelContext channelContext) throws Exception;
+ HttpResponse handshake(HttpRequest httpRequest, HttpResponse httpResponse, ChannelContext channelContext) throws Exception;
/**
* 握手成功后触发该方法
@@ -225,7 +225,7 @@ public interface IWsMsgHandler {
* @throws Exception
* @author tanyaowu
*/
- public void onAfterHandshaked(HttpRequest httpRequest, HttpResponse httpResponse, ChannelContext channelContext) throws Exception;
+ void onAfterHandshaked(HttpRequest httpRequest, HttpResponse httpResponse, ChannelContext channelContext) throws Exception;
/**
* 当收到Opcode.BINARY消息时,执行该方法。也就是说如何你的ws是基于BINARY传输的,就会走到这个方法
diff --git a/src/zoo/websocket/common/src/main/java/org/tio/websocket/common/util/Md5.java b/src/zoo/websocket/server/src/main/java/org/tio/websocket/server/handler/IWsSubProtocolsMsgHandler.java
similarity index 87%
rename from src/zoo/websocket/common/src/main/java/org/tio/websocket/common/util/Md5.java
rename to src/zoo/websocket/server/src/main/java/org/tio/websocket/server/handler/IWsSubProtocolsMsgHandler.java
index a86c784d..7a9bb4ae 100644
--- a/src/zoo/websocket/common/src/main/java/org/tio/websocket/common/util/Md5.java
+++ b/src/zoo/websocket/server/src/main/java/org/tio/websocket/server/handler/IWsSubProtocolsMsgHandler.java
@@ -191,69 +191,41 @@ recommend that a file or class name and description of purpose be included on
See the License for the specific language governing permissions and
limitations under the License.
*/
-package org.tio.websocket.common.util;
-import java.io.UnsupportedEncodingException;
+package org.tio.websocket.server.handler;
-import org.apache.commons.codec.digest.DigestUtils;
+import org.tio.core.ChannelContext;
+import org.tio.core.TioConfig;
+import org.tio.core.intf.Packet;
+import org.tio.websocket.common.WsResponse;
/**
+ * websocket 子协议处理器
*
- * @author tanyaowu
- * 2017年7月30日 上午10:11:28
+ * @author L.cm
+ * 2021年7月31日 上午10:34:59
*/
-public class Md5 {
+public interface IWsSubProtocolsMsgHandler {
- /**
- *
- * @param content
- * @param charset
- * @return
- * @author tanyaowu
- */
- private static byte[] getContentBytes(String content, String charset) {
- if (charset == null || "".equals(charset)) {
- return content.getBytes();
- }
- try {
- return content.getBytes(charset);
- } catch (UnsupportedEncodingException e) {
- throw new RuntimeException("MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:" + charset);
- }
- }
+ /**
+ * 获取支持的子协议
+ *
+ * @return 子协议数组
+ */
+ default String[] getSupportedSubProtocols() {
+ return null;
+ }
- public static String getMD5(String input) {
- return sign(input, "", "utf-8");
- }
-
- /**
- * 签名字符串
- * @param text 需要签名的字符串
- * @param key 密钥
- * @param input_charset 编码格式
- * @return 签名结果
- */
- public static String sign(String text, String key, String input_charset) {
- text = text + key;
- return DigestUtils.md5Hex(getContentBytes(text, input_charset));
- }
-
- /**
- * 签名字符串
- * @param text 需要签名的字符串
- * @param sign 签名结果
- * @param key 密钥
- * @param input_charset 编码格式
- * @return 签名结果
- */
- public static boolean verify(String text, String sign, String key, String input_charset) {
- text = text + key;
- String mysign = DigestUtils.md5Hex(getContentBytes(text, input_charset));
- if (mysign.equals(sign)) {
- return true;
- } else {
- return false;
- }
- }
+ /**
+ * 解析子编码
+ *
+ * @param packet Packet
+ * @param tioConfig TioConfig
+ * @param channelContext ChannelContext
+ * @return Packet
+ */
+ default WsResponse encodeSubProtocol(Packet packet, TioConfig tioConfig, ChannelContext channelContext) {
+ return null;
+ }
}