Fixed additional JSON escaps and added tests

This commit is contained in:
Ziver Koc 2023-03-29 01:40:55 +02:00
parent 86296df176
commit 670f95689d
5 changed files with 57 additions and 12 deletions

View file

@ -200,6 +200,7 @@ public class MqttBroker extends ThreadedTCPNetworkServer {
private Socket socket;
private BinaryStructInputStream in;
private BinaryStructOutputStream out;
private String clientId;
private boolean disconnected = false;
/** A message that should be sent in case the connection to client is abnormally disconnected */
@ -217,6 +218,7 @@ public class MqttBroker extends ThreadedTCPNetworkServer {
public MqttConnectionThread(MqttBroker b, Socket s) throws IOException {
this(b);
socket = s;
clientId = socket.getInetAddress().toString();
InputStream baseInputstream = socket.getInputStream();
if (!baseInputstream.markSupported())
@ -352,7 +354,7 @@ public class MqttBroker extends ThreadedTCPNetworkServer {
// Close connection
default:
logger.warning("[" + socket.getInetAddress() + "] Received unknown packet type: " + packet.type + " (" + packet.getClass() + ")");
logger.warning("[" + clientId + "] Received unknown packet type: " + packet.type + " (" + packet.getClass() + ")");
sendWillPacket();
/* FALLTHROUGH */
case MqttPacketHeader.PACKET_TYPE_DISCONNECT:
@ -367,7 +369,7 @@ public class MqttBroker extends ThreadedTCPNetworkServer {
if (publishPacket.getFlagQoS() != 0)
throw new UnsupportedOperationException("QoS larger then 0 not supported.");
logger.finer("[" + socket.getInetAddress() + "] Publishing to topic: " + publishPacket.topicName);
logger.finer("[" + clientId + "] Publishing to topic: " + publishPacket.topicName);
broker.publish(publishPacket.topicName, publishPacket.payload);
}
@ -376,7 +378,7 @@ public class MqttBroker extends ThreadedTCPNetworkServer {
subscribeAckPacket.packetId = subscribePacket.packetId;
for (MqttSubscribePayload payload : subscribePacket.payloads) {
logger.finer("[" + socket.getInetAddress() + "] Subscribing to topic: " + payload.topicFilter);
logger.finer("[" + clientId + "] Subscribing to topic: " + payload.topicFilter);
broker.subscribe(payload.topicFilter, this);
// Prepare response
@ -390,7 +392,7 @@ public class MqttBroker extends ThreadedTCPNetworkServer {
private void handleUnsubscribe(MqttPacketUnsubscribe unsubscribePacket) throws IOException {
for (MqttUnsubscribePayload payload : unsubscribePacket.payloads) {
logger.finer("[" + socket.getInetAddress() + "] Unsubscribing from topic: " + payload.topicFilter);
logger.finer("[" + clientId + "] Unsubscribing from topic: " + payload.topicFilter);
broker.unsubscribe(payload.topicFilter, this);
}
@ -408,7 +410,7 @@ public class MqttBroker extends ThreadedTCPNetworkServer {
private void sendWillPacket() throws IOException {
if (willPacket != null) {
logger.fine("[" + socket.getInetAddress() + "] Publishing will packet.");
logger.fine("[" + clientId + "] Publishing will packet.");
sendPacket(willPacket);
willPacket = null;
}

View file

@ -128,15 +128,19 @@ public class JSONParser extends Parser {
}
end.i = CONTINUE;
break;
// Parse String
// TODO: Support double backslash escaping
// Parse quoted String
case '\"':
case '\'':
root = new DataNode(DataType.String);
StringBuilder str = new StringBuilder();
int c2;
while ((c2=in.read()) >= 0 && c2 != c)
while ((c2=in.read()) >= 0 && c2 != c) {
// Ignore the character check for next char as current char is \ escape
if (c2 == '\\')
c2 = in.read();
str.append((char) c2);
}
root.set(str.toString());
break;
// Parse unknown type
@ -147,7 +151,10 @@ public class JSONParser extends Parser {
end.i = END_WITH_VALUE;
break;
}
tmp.append((char)c);
if (c == '\\')
c = in.read();
tmp.append((char) c);
}
// Check what type of type the data is
String data = tmp.toString().trim();

View file

@ -34,11 +34,11 @@ import java.io.Writer;
import java.util.Iterator;
/**
* Writes An JSONNode to an String or stream
* Writes An JSONNode to a String or stream
*
* @author Ziver
*/
public class JSONWriter{
public class JSONWriter {
private PrintWriter out;
/**