Skip to content

Commit 1799b16

Browse files
committed
feat: 添加单元测试。一个TunnelServer支持控制多个TunnelClient
1 parent 17eb014 commit 1799b16

File tree

2 files changed

+38
-14
lines changed

2 files changed

+38
-14
lines changed

src/main/java/top/meethigher/proxy/tcp/tunnel/ReverseTcpProxyTunnelServer.java

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -107,17 +107,28 @@ protected boolean doHandle(Vertx vertx, NetSocket netSocket, TunnelMessageType t
107107
TunnelMessage.OpenDataPortAck.Builder builder = TunnelMessage.OpenDataPortAck
108108
.newBuilder();
109109
if (secret.equals(parsed.getSecret())) {
110-
final DataProxyServer dataProxyServer = new DataProxyServer(vertx, parsed.getDataProxyName(), parsed.getDataProxyPort(), netSocket);
111-
if (dataProxyServer.startSync()) {
112-
result = true;
113-
builder.setSuccess(result).setMessage("success");
114-
netSocket.write(encode(TunnelMessageType.OPEN_DATA_PORT_ACK,
115-
builder.build().toByteArray()));
116-
authedSockets.put(netSocket, dataProxyServer);
117-
} else {
118-
builder.setSuccess(result).setMessage("fail to open data port " + parsed.getDataProxyPort());
119-
netSocket.write(encode(TunnelMessageType.OPEN_DATA_PORT_ACK,
120-
builder.build().toByteArray())).onComplete(ar -> netSocket.close());
110+
synchronized (ReverseTcpProxyTunnelServer.class) {
111+
// 判断dataProxyName是否唯一
112+
for (DataProxyServer server : authedSockets.values()) {
113+
if (server.name.equals(parsed.getDataProxyName())) {
114+
builder.setSuccess(result).setMessage(server.name + " already started");
115+
netSocket.write(encode(TunnelMessageType.OPEN_DATA_PORT_ACK,
116+
builder.build().toByteArray())).onComplete(ar -> netSocket.close());
117+
return result;
118+
}
119+
}
120+
final DataProxyServer dataProxyServer = new DataProxyServer(vertx, parsed.getDataProxyName(), parsed.getDataProxyPort(), netSocket);
121+
if (dataProxyServer.startSync()) {
122+
result = true;
123+
builder.setSuccess(result).setMessage("success");
124+
netSocket.write(encode(TunnelMessageType.OPEN_DATA_PORT_ACK,
125+
builder.build().toByteArray()));
126+
authedSockets.put(netSocket, dataProxyServer);
127+
} else {
128+
builder.setSuccess(result).setMessage("fail to open data port " + parsed.getDataProxyPort());
129+
netSocket.write(encode(TunnelMessageType.OPEN_DATA_PORT_ACK,
130+
builder.build().toByteArray())).onComplete(ar -> netSocket.close());
131+
}
121132
}
122133

123134
} else {

src/test/java/top/meethigher/proxy/tcp/tunnel/ReverseTcpProxyTunnelClientTest.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,22 @@ public void client() {
131131
Vertx vertx = Vertx.vertx(new VertxOptions().setAddressResolverOptions(
132132
new AddressResolverOptions().setQueryTimeout(2000)
133133
));
134-
ReverseTcpProxyTunnelClient.create(ReverseTcpProxyTunnelClientTest.vertx, vertx.createNetClient()).connect("127.0.0.1", 44444);
135-
136-
134+
// http内网穿透
135+
ReverseTcpProxyTunnelClient.create(ReverseTcpProxyTunnelClientTest.vertx, vertx.createNetClient())
136+
.backendHost("reqres.in")
137+
.backendPort(80)
138+
.dataProxyName("http-proxy")
139+
.dataProxyHost("127.0.0.1")
140+
.dataProxyPort(80)
141+
.connect("127.0.0.1", 44444);
142+
// ssh内网穿透
143+
ReverseTcpProxyTunnelClient.create(ReverseTcpProxyTunnelClientTest.vertx, vertx.createNetClient())
144+
.backendHost("meethigher.top")
145+
.backendPort(22)
146+
.dataProxyName("ssh-proxy")
147+
.dataProxyHost("127.0.0.1")
148+
.dataProxyPort(22)
149+
.connect("127.0.0.1", 44444);
137150
LockSupport.park();
138151
}
139152
}

0 commit comments

Comments
 (0)