Skip to content

Commit 2acdd05

Browse files
committed
- Server connection handler fixes.
- Logging tweaks. - Test case updates. - Minor version bump.
1 parent 44e6ec3 commit 2acdd05

File tree

11 files changed

+68
-45
lines changed

11 files changed

+68
-45
lines changed

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ subprojects {
44
apply(plugin = "io.vacco.oss.gitflow")
55

66
group = "io.vacco.tokoeka"
7-
version = "0.4.1"
7+
version = "0.5.0"
88

99
configure<io.vacco.oss.gitflow.GsPluginProfileExtension> {
1010
sharedLibrary(true, false)

tk-sdr/src/main/java/io/vacco/tokoeka/TkSocket.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,19 +71,15 @@ public void listen(Supplier<Boolean> go) {
7171
break;
7272
}
7373
}
74-
this.close();
74+
doClose(this);
7575
}
7676

7777
@Override public void accept(String s) {
7878
send(s, this.outputStream);
7979
}
8080

8181
@Override public void close() {
82-
try {
83-
socket.close();
84-
} catch (IOException e) {
85-
log.error("Unable to close ws socket: {} - {}", this, e.getMessage());
86-
}
82+
doClose(socket);
8783
if (log.isDebugEnabled()) {
8884
log.debug("ws connection closed");
8985
}

tk-sdr/src/main/java/io/vacco/tokoeka/TkSocketServer.java

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ private void handleClient(Socket clientSocket) {
5454
clientSocket, socketState,
5555
msg -> send(msg, outputStream),
5656
(code, msg) -> {
57-
57+
sendClose(outputStream, code, msg);
58+
doClose(clientSocket);
5859
}
5960
);
6061
this.socketHdl.onOpen(conn, handshakeResponse);
@@ -72,22 +73,14 @@ private void handleClient(Socket clientSocket) {
7273
log.debug("Incoming connection handler error - {}", clientSocket.getRemoteSocketAddress(), e);
7374
}
7475
} finally {
75-
try {
76-
clientSocket.close();
77-
} catch (IOException e) {
78-
log.warn("Incoming connection close error - {}", e.getMessage());
79-
}
76+
doClose(clientSocket);
8077
}
8178
}
8279

8380
@Override public void close() {
8481
clientThreadPool.shutdown();
8582
if (serverSocket != null) {
86-
try {
87-
serverSocket.close();
88-
} catch (Exception e) {
89-
log.warn("Websocket server close error - {}", e.getMessage());
90-
}
83+
doClose(serverSocket);
9184
}
9285
}
9386

tk-sdr/src/main/java/io/vacco/tokoeka/audio/TkAudioPlayer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,5 @@ public void close() {
7070
line.close();
7171
}
7272
}
73+
7374
}

tk-sdr/src/main/java/io/vacco/tokoeka/handler/TkControlHdl.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import java.net.URLDecoder;
1010
import java.nio.ByteBuffer;
1111
import java.nio.charset.StandardCharsets;
12-
import java.util.function.Consumer;
1312

1413
import static io.vacco.tokoeka.schema.TkConstants.*;
1514
import static io.vacco.tokoeka.util.TkCommand.*;
@@ -68,19 +67,15 @@ private void processKeyValue(String key, String value) {
6867
case down: this.controlEvent(-1, key, value, true, null); break;
6968
default:
7069
if (log.isDebugEnabled()) {
71-
var val = value == null ? "" : value.trim();
72-
if (val.length() > 64) {
73-
val = String.format("%s...", val.substring(0, 64));
74-
}
75-
log.debug("Unknown message key/value: {} -> {}", key, val);
70+
log.debug("Unknown message key/value: {} -> {}", key, shorten(value));
7671
}
7772
}
7873
}
7974

8075
private void processMsg(String body) {
8176
var params = parseParameters(body);
8277
if (log.isTraceEnabled()) {
83-
log.trace(">> {} {} {}", MSG, body, params);
78+
log.trace(">> {} {} {}", MSG, shorten(body), shorten(params.toString()));
8479
}
8580
params.forEach(this::processKeyValue);
8681
}

tk-sdr/src/main/java/io/vacco/tokoeka/spi/TkConn.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
package io.vacco.tokoeka.spi;
22

3-
import java.io.Closeable;
43
import java.net.Socket;
54
import java.util.function.Consumer;
65

7-
public interface TkConn extends Consumer<String>, Closeable {
6+
public interface TkConn extends Consumer<String> {
87
void setAttachment(Object attachment);
98
<T> T getAttachment();
109
Socket getSocket();

tk-sdr/src/main/java/io/vacco/tokoeka/util/TkConnAdapter.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package io.vacco.tokoeka.util;
22

33
import io.vacco.tokoeka.spi.TkConn;
4-
5-
import java.io.IOException;
64
import java.net.Socket;
75
import java.util.Objects;
86
import java.util.function.BiConsumer;
@@ -40,10 +38,6 @@ public TkConnAdapter(Socket socket, TkSocketState socketState,
4038
return socket;
4139
}
4240

43-
@Override public void close() throws IOException {
44-
socket.close();
45-
}
46-
4741
@Override public void close(int code) {
4842
onClose.accept(code, null);
4943
}

tk-sdr/src/main/java/io/vacco/tokoeka/util/TkFormat.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212

1313
public class TkFormat {
1414

15+
public static int DefaultMessageShorten = 64;
16+
1517
public static String asString(ByteBuffer bytes) {
1618
return StandardCharsets.UTF_8.decode(bytes).toString();
1719
}
@@ -50,4 +52,22 @@ public static TkDxConfig loadKiwiDxConfig(String data, TkJsonIn jsonIn) {
5052
return load(data, TkDxConfig.class, jsonIn);
5153
}
5254

55+
public static String shorten(String msg, int maxLength) {
56+
if (msg == null) {
57+
return "null";
58+
}
59+
msg = msg.trim();
60+
if (msg.length() <= maxLength || maxLength == 1) {
61+
return msg;
62+
}
63+
var ml2 = maxLength / 2;
64+
var v0 = msg.substring(0, ml2);
65+
var v1 = msg.substring(msg.length() - ml2);
66+
return String.format("%s...%s", v0, v1);
67+
}
68+
69+
public static String shorten(String msg) {
70+
return shorten(msg, DefaultMessageShorten);
71+
}
72+
5373
}

tk-sdr/src/main/java/io/vacco/tokoeka/util/TkSockets.java

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import static java.nio.ByteBuffer.wrap;
1313
import static java.lang.System.currentTimeMillis;
14+
import static io.vacco.tokoeka.util.TkFormat.shorten;
1415

1516
public class TkSockets {
1617

@@ -218,10 +219,7 @@ public static void send(String message, OutputStream outputStream) {
218219
log.trace("> TXT: {} ({} bytes)", message, payload.length);
219220
}
220221
} catch (Exception e) {
221-
var msg = message != null && message.length() > 64
222-
? String.format("%s...", message.substring(0, 64))
223-
: message;
224-
throw new IllegalStateException(String.format("unable to send text: %s", msg), e);
222+
throw new IllegalStateException(String.format("unable to send text: %s", shorten(message)), e);
225223
}
226224
}
227225

@@ -264,7 +262,7 @@ public static boolean handleMessage(TkSocketHdl socketHdl, TkSocketState socketS
264262
var pongDiff = nowMs - socketState.lastPongMs;
265263
var pongExp = pongDiff != nowMs && pongDiff >= socketState.keepAliveMs; // missing subsequent client pong
266264
if (pongExp) {
267-
log.debug("Ping/Pong keep-alive expired {}, pingDiff: {}, pongDiff: {}", conn.getSocket().getRemoteSocketAddress(), pingDiff, pongDiff);
265+
log.warn("Ping/Pong keep-alive expired {}, pingDiff: {}, pongDiff: {}", conn.getSocket().getRemoteSocketAddress(), pingDiff, pongDiff);
268266
sendClose(outputStream, WsCloseGoAway, WsCloseGoAwayRes);
269267
socketHdl.onClose(conn, WsCloseGoAway, false);
270268
return true;
@@ -301,7 +299,7 @@ public static boolean handleMessage(TkSocketHdl socketHdl, TkSocketState socketS
301299
if (opcode == 0x1) {
302300
var msg = new String(completeMessage);
303301
if (log.isTraceEnabled()) {
304-
log.trace("< TXT: {}", msg);
302+
log.trace("< TXT: {}", shorten(msg));
305303
}
306304
socketHdl.onMessage(conn, msg);
307305
} else if (opcode == 0x2) {
@@ -333,4 +331,16 @@ public static boolean handleMessage(TkSocketHdl socketHdl, TkSocketState socketS
333331
return false;
334332
}
335333

334+
public static void doClose(Closeable c) {
335+
try {
336+
c.close();
337+
} catch (Exception e) {
338+
if (log.isWarnEnabled()) {
339+
log.warn("Error closing {} - {}", c, e.getMessage());
340+
} else if (log.isDebugEnabled()) {
341+
log.debug("Error closing {}", c);
342+
}
343+
}
344+
}
345+
336346
}

tk-sdr/src/test/java/io/vacco/tokoeka/TkControlHdlTest.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,14 @@
88
import j8spec.junit.J8SpecRunner;
99
import org.junit.runner.RunWith;
1010
import org.slf4j.*;
11-
12-
import java.io.IOException;
1311
import java.io.InputStreamReader;
1412
import java.net.Socket;
1513
import java.nio.ByteBuffer;
1614
import java.util.*;
1715

1816
import static j8spec.J8Spec.*;
1917
import static io.vacco.tokoeka.TkLogging.initLog;
18+
import static io.vacco.tokoeka.util.TkFormat.shorten;
2019

2120
@DefinedOrder
2221
@RunWith(J8SpecRunner.class)
@@ -44,8 +43,9 @@ public class TkControlHdlTest {
4443
@Override public void setAttachment(Object attachment) {}
4544
@Override public <T> T getAttachment() { return null; }
4645
@Override public Socket getSocket() { return null; }
47-
@Override public void close() {}
48-
@Override public void close(int code) {}
46+
@Override public void close(int code) {
47+
log.info("close - [{}]", code);
48+
}
4949
@Override public void close(int code, String msg) {
5050
log.info("close - [{}, {}]", code, msg);
5151
}
@@ -62,7 +62,7 @@ public class TkControlHdlTest {
6262
.withConfigPin(((kiwiConfig, dxConfig, dxCommConfig) -> {
6363
for (var o : new Object[]{kiwiConfig, dxConfig, dxCommConfig}) {
6464
if (o != null) {
65-
log.info(g.toJson(o));
65+
log.info(shorten(g.toJson(o)));
6666
}
6767
}
6868
}));
@@ -72,7 +72,7 @@ public class TkControlHdlTest {
7272
var bytes = ByteBuffer.wrap(Base64.getDecoder().decode(msg.data));
7373
ctlHdl.onMessage(conn, bytes);
7474
} else {
75-
log.info("Ref command ==> {}", msg.data);
75+
log.info("Ref command ==> {}", shorten(msg.data));
7676
}
7777
}
7878
for (var msg : wfMessages) {

tk-sdr/src/test/java/io/vacco/tokoeka/TkPairTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.vacco.tokoeka;
22

3+
import io.vacco.tokoeka.util.TkFormat;
34
import j8spec.annotation.DefinedOrder;
45
import j8spec.junit.J8SpecRunner;
56
import org.junit.runner.RunWith;
@@ -24,5 +25,19 @@ public class TkPairTest {
2425
);
2526
assertEquals("SET single hello=world boolFlag1=1 boolFlag0=0 intArg=999 dblArg=1.235", cmd);
2627
});
28+
it("Formats redacted messages", () -> {
29+
assertEquals("null", TkFormat.shorten(null, 0));
30+
assertEquals("1", TkFormat.shorten("1", 2));
31+
assertEquals("1", TkFormat.shorten("1", 1));
32+
assertEquals("1", TkFormat.shorten("1", 2));
33+
assertEquals("1...1", TkFormat.shorten("111", 2));
34+
assertEquals("1...1", TkFormat.shorten("1111", 2));
35+
assertEquals("1...1", TkFormat.shorten("11111", 2));
36+
assertEquals("111", TkFormat.shorten("111", 3));
37+
assertEquals("1...1", TkFormat.shorten("1111", 3));
38+
assertEquals("1...1", TkFormat.shorten("11111", 3));
39+
assertEquals("01...34", TkFormat.shorten("01234", 4));
40+
assertEquals("0123...CDEF", TkFormat.shorten("0123456789ABCDEF", 8));
41+
});
2742
}
2843
}

0 commit comments

Comments
 (0)