SLING-7947 Play ping-pong with clam daemon after configuration of ClamdService
diff --git a/src/main/java/org/apache/sling/commons/clam/internal/ClamdService.java b/src/main/java/org/apache/sling/commons/clam/internal/ClamdService.java
index ef23eb8..581dc0d 100644
--- a/src/main/java/org/apache/sling/commons/clam/internal/ClamdService.java
+++ b/src/main/java/org/apache/sling/commons/clam/internal/ClamdService.java
@@ -25,6 +25,7 @@
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
import org.apache.commons.io.IOUtils;
import org.apache.sling.commons.clam.ClamService;
@@ -53,6 +54,10 @@
private ClamdServiceConfiguration configuration;
+ private static final byte[] PING_COMMAND = "nPING\n".getBytes(StandardCharsets.US_ASCII);
+
+ private static final byte[] PONG_REPLY = "PONG\n".getBytes(StandardCharsets.US_ASCII);
+
private static final byte[] INSTREAM_COMMAND = "nINSTREAM\n".getBytes(StandardCharsets.US_ASCII);
private static final String OK_REPLY_PATTERN = "stream: OK";
@@ -85,7 +90,7 @@
private void configure(final ClamdServiceConfiguration configuration) {
this.configuration = configuration;
- // TODO play ping pong on configuration change
+ playPingPong();
}
@Override
@@ -100,6 +105,36 @@
}
}
+ private byte[] doPing() throws IOException {
+ logger.info("pinging clam daemon at {}:{}", configuration.clamd_host(), configuration.clamd_port());
+ try (final Socket socket = new Socket(configuration.clamd_host(), configuration.clamd_port());
+ final OutputStream out = new BufferedOutputStream(socket.getOutputStream());
+ final InputStream in = socket.getInputStream()) {
+
+ socket.setSoTimeout(configuration.connection_timeout());
+
+ // send command
+ out.write(PING_COMMAND);
+ out.flush();
+
+ return IOUtils.toByteArray(in);
+ }
+ }
+
+ private void playPingPong() {
+ try {
+ final byte[] reply = doPing();
+ if (Arrays.equals(reply, PONG_REPLY)) {
+ logger.info("clam daemon replied with PONG");
+ } else {
+ final String message = new String(reply, StandardCharsets.US_ASCII);
+ logger.error("clam daemon replied with unknown message: {}", message);
+ }
+ } catch (IOException e) {
+ logger.error("pinging clam daemon failed: {}", e.getMessage());
+ }
+ }
+
/**
* man (8) clamd
* INSTREAM