Skip to content

Commit 07ac4e1

Browse files
committed
fix: 1. 添加消息编解码单元测试 2. 解决消息编解码逻辑错误问题
1 parent 8d9c7f0 commit 07ac4e1

File tree

2 files changed

+40
-12
lines changed

2 files changed

+40
-12
lines changed

src/main/java/top/meethigher/proxy/tcp/tunnel/codec/TunnelMessageParser.java

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,12 @@ public void handle(Buffer buffer) {
6969
}
7070

7171
private void parse() {
72+
// 获取消息的预设总长度
7273
int totalLength = buf.getInt(lengthFieldOffset);
74+
// 校验预设总长度
75+
if (buf.length() < totalLength) {
76+
return;
77+
}
7378
// 校验最大长度
7479
if (totalLength > maxLength) {
7580
log.warn("too many bytes in length field, {} > {}, connection {} will be closed",
@@ -89,18 +94,12 @@ private void parse() {
8994
return;
9095
}
9196
}
92-
93-
// 校验是否达到预设总长度
94-
if (buf.length() < totalLength) {
95-
return;
96-
} else {
97-
outputHandler.handle(buf.getBuffer(0, totalLength));
98-
buf = buf.getBuffer(totalLength, buf.length());
99-
// 缓冲区未清空时,要将数据进一步解析。https://github.com/meethigher/tcp-reverse-proxy/issues/7
100-
if (buf.length() > 0) {
101-
parse();
102-
}
103-
return;
97+
// 将数据写出
98+
outputHandler.handle(buf.getBuffer(0, totalLength));
99+
buf = buf.getBuffer(totalLength, buf.length());
100+
// 缓冲区未清空时,要将数据进一步解析。https://github.com/meethigher/tcp-reverse-proxy/issues/7
101+
if (buf.length() > lengthFieldLength) {
102+
parse();
104103
}
105104
}
106105
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package top.meethigher.proxy.tcp.tunnel.codec;
2+
3+
import io.vertx.core.Handler;
4+
import io.vertx.core.buffer.Buffer;
5+
import org.junit.Test;
6+
7+
import java.nio.charset.StandardCharsets;
8+
9+
public class TunnelMessageParserTest {
10+
11+
@Test
12+
public void handle() {
13+
14+
Buffer buffer1 = TunnelMessageCodec.encode((short) 1, "first message".getBytes(StandardCharsets.UTF_8));
15+
Buffer buffer2 = TunnelMessageCodec.encode((short) 2, "second message".getBytes(StandardCharsets.UTF_8));
16+
Buffer buffer3 = TunnelMessageCodec.encode((short) 3, "third message".getBytes(StandardCharsets.UTF_8));
17+
Buffer buffer4 = TunnelMessageCodec.encode((short) 4, "forth message".getBytes(StandardCharsets.UTF_8));
18+
19+
Buffer buffer = Buffer.buffer().appendBuffer(buffer1).appendBuffer(buffer2).appendBuffer(buffer3).appendBuffer(buffer4);
20+
Handler<Buffer> handler = buf -> {
21+
TunnelMessageCodec.DecodedMessage decodedMessage = TunnelMessageCodec.decode(buf);
22+
System.out.println(new String(decodedMessage.body));
23+
};
24+
25+
TunnelMessageParser parser = new TunnelMessageParser(handler, null);
26+
27+
parser.handle(buffer);
28+
}
29+
}

0 commit comments

Comments
 (0)