Add serverside caching and improve sanitizing.

This commit is contained in:
pixtaded 2025-01-12 17:26:21 +03:00
parent c2e8927c42
commit e96b02357d
6 changed files with 45 additions and 16 deletions

View File

@ -1,6 +1,7 @@
package net.pixtaded.crab.client; package net.pixtaded.crab.client;
import net.pixtaded.crab.common.Crab; import net.pixtaded.crab.common.Crab;
import net.pixtaded.crab.common.Logs;
import net.pixtaded.crab.common.Sanitizer; import net.pixtaded.crab.common.Sanitizer;
import java.io.*; import java.io.*;

View File

@ -1,4 +1,4 @@
package net.pixtaded.crab.client; package net.pixtaded.crab.common;
public record Logs(int sizeInBytes, String content) { public record Logs(int sizeInBytes, String content) {
} }

View File

@ -2,11 +2,15 @@ package net.pixtaded.crab.common;
public class Sanitizer { public class Sanitizer {
public static String sanitizeString(String s, boolean sanitizeNewlines) { public static String sanitizeString(String s, boolean sanitizeNewlines) {
String sanitized = s.replaceAll("\033", ""); String sanitized = s.replaceAll("[\010\015\033]", "");
if (sanitizeNewlines) { if (sanitizeNewlines) {
sanitized = sanitized.replaceAll("\n", "\\\\n"); sanitized = sanitized.replaceAll("\n", "\\\\n");
if (!s.endsWith("\n")) sanitized += '\n'; if (!s.endsWith("\n")) sanitized += '\n';
} }
return sanitized; return sanitized;
} }
public static String formatMessage(long timeMillis, String address, String content) {
return String.format("[%td.%1$tm.%1$tY %1$tR] {%s} %s", timeMillis, address, content);
}
} }

View File

@ -1,5 +1,6 @@
package net.pixtaded.crab.server; package net.pixtaded.crab.server;
import net.pixtaded.crab.common.Crab; import net.pixtaded.crab.common.Crab;
import net.pixtaded.crab.common.Logs;
import java.io.IOException; import java.io.IOException;
import java.net.ServerSocket; import java.net.ServerSocket;
@ -13,6 +14,7 @@ public class CrabServer implements Crab {
private boolean isStopped = false; private boolean isStopped = false;
private int port; private int port;
private final Database db; private final Database db;
public Logs cache = new Logs(0, "");
public CrabServer() { public CrabServer() {
this.db = new Database("data.db"); this.db = new Database("data.db");
@ -28,6 +30,7 @@ public class CrabServer implements Crab {
try { try {
if (this.port == 0) if (this.port == 0)
setup(); setup();
this.cache = getDb().getLogs();
listen(); listen();
} catch (IOException e) { } catch (IOException e) {
if (!isStopped) System.err.println("Error starting server: " + e.getMessage()); if (!isStopped) System.err.println("Error starting server: " + e.getMessage());

View File

@ -1,15 +1,14 @@
package net.pixtaded.crab.server; package net.pixtaded.crab.server;
import net.pixtaded.crab.common.Logs;
import net.pixtaded.crab.common.Sanitizer; import net.pixtaded.crab.common.Sanitizer;
import java.sql.*; import java.sql.*;
import java.util.Date; import java.util.Date;
import java.util.Locale;
public class Database implements AutoCloseable { public class Database implements AutoCloseable {
private Connection connection; private Connection connection;
private String logs = "";
public Database(String dbName) { public Database(String dbName) {
try { try {
@ -50,22 +49,17 @@ public class Database implements AutoCloseable {
} }
} }
public String getLogs() { public Logs getLogs() {
StringBuilder s = new StringBuilder(); StringBuilder s = new StringBuilder();
try (ResultSet rs = query("SELECT time, address, msg FROM messages")) { try (ResultSet rs = query("SELECT time, address, msg FROM messages")) {
while (rs.next()) { while (rs.next()) {
s.append(String.format("[%td.%1$tm.%1$tY %1$tR] {%s} %s", rs.getLong(1), rs.getString(2), rs.getString(3))); s.append(Sanitizer.formatMessage(rs.getLong(1), rs.getString(2), rs.getString(3)));
} }
} catch (SQLException e) { } catch (SQLException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
logs = s.toString(); String logsString = s.toString();
return logs; return new Logs(logsString.isEmpty() ? 0 : logsString.getBytes().length, logsString);
}
public int getLogSize() {
if (logs.isEmpty()) return 0;
else return logs.getBytes().length;
} }
@Override @Override

View File

@ -1,5 +1,8 @@
package net.pixtaded.crab.server; package net.pixtaded.crab.server;
import net.pixtaded.crab.common.Logs;
import net.pixtaded.crab.common.Sanitizer;
import java.io.*; import java.io.*;
import java.net.Socket; import java.net.Socket;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
@ -36,11 +39,19 @@ public class ServerThread implements Runnable {
} }
switch (PID[0]) { switch (PID[0]) {
case MESSAGE -> { case MESSAGE -> {
server.getDb().logMessage(new Date(), socket.getInetAddress().getHostAddress(), new String(input.readNBytes(4096), StandardCharsets.UTF_8).trim()); Date date = new Date();
String msg = new String(input.readNBytes(4096), StandardCharsets.UTF_8).trim();
String address = socket.getInetAddress().getHostAddress();
new Thread(new LogDBThread(date, address, msg)).start();
String s = Sanitizer.sanitizeString(msg, true);
String newContent = server.cache.content() + Sanitizer.formatMessage(date.getTime(), address, s);
server.cache = new Logs(newContent.getBytes().length, newContent);
} case LOGS -> { } case LOGS -> {
respond(server.getDb().getLogs()); respond(server.cache.content());
} case LOGS_SIZE -> { } case LOGS_SIZE -> {
respond(String.valueOf(server.getDb().getLogSize())); respond(String.valueOf(server.cache.sizeInBytes()));
} default -> { } default -> {
System.out.println("PID not implemented: " + PID[0]); System.out.println("PID not implemented: " + PID[0]);
} }
@ -59,4 +70,20 @@ public class ServerThread implements Runnable {
private void respond(String utf8) throws IOException { private void respond(String utf8) throws IOException {
respond(utf8.getBytes(StandardCharsets.UTF_8)); respond(utf8.getBytes(StandardCharsets.UTF_8));
} }
private class LogDBThread implements Runnable {
Date date;
String msg;
public LogDBThread(Date date, String address, String msg) {
this.date = date;
this.msg = msg;
}
@Override
public void run() {
server.getDb().logMessage(date, socket.getInetAddress().getHostAddress(), msg);
}
}
} }