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

View file

@ -128,15 +128,19 @@ public class JSONParser extends Parser {
} }
end.i = CONTINUE; end.i = CONTINUE;
break; break;
// Parse String // Parse quoted String
// TODO: Support double backslash escaping
case '\"': case '\"':
case '\'': case '\'':
root = new DataNode(DataType.String); root = new DataNode(DataType.String);
StringBuilder str = new StringBuilder(); StringBuilder str = new StringBuilder();
int c2; 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); str.append((char) c2);
}
root.set(str.toString()); root.set(str.toString());
break; break;
// Parse unknown type // Parse unknown type
@ -147,6 +151,9 @@ public class JSONParser extends Parser {
end.i = END_WITH_VALUE; end.i = END_WITH_VALUE;
break; break;
} }
if (c == '\\')
c = in.read();
tmp.append((char) c); tmp.append((char) c);
} }
// Check what type of type the data is // Check what type of type the data is

View file

@ -34,7 +34,7 @@ import java.io.Writer;
import java.util.Iterator; import java.util.Iterator;
/** /**
* Writes An JSONNode to an String or stream * Writes An JSONNode to a String or stream
* *
* @author Ziver * @author Ziver
*/ */

View file

@ -92,13 +92,27 @@ public class JSONParserTest {
} }
@Test @Test
public void valueStringNoQuotes(){ public void valueString(){
DataNode data = JSONParser.read("teststring"); DataNode data = JSONParser.read("teststring");
assert(data.isValue()); assert(data.isValue());
assertEquals( DataType.String, data.getType()); assertEquals( DataType.String, data.getType());
assertEquals( "teststring", data.getString()); assertEquals( "teststring", data.getString());
} }
@Test
public void valueStringWithQuotes(){
DataNode data = JSONParser.read("aa \\\"bb\\\" cc");
assert(data.isValue());
assertEquals( DataType.String, data.getType());
assertEquals( "aa \"bb\" cc", data.getString());
data = JSONParser.read("{\"test_key\": \"aa \\\"bb\\\" cc\"}");
assertEquals( DataType.String, data.get("test_key").getType());
assertEquals( "aa \"bb\" cc", data.get("test_key").getString());
}
@Test @Test
public void toManyCommasInList(){ public void toManyCommasInList(){
DataNode data = JSONParser.read("[1,2,3,]"); DataNode data = JSONParser.read("[1,2,3,]");

View file

@ -0,0 +1,22 @@
package zutil.parser.json;
import org.junit.Test;
import zutil.parser.DataNode;
import static org.junit.Assert.*;
public class JSONWriterTest {
@Test
public void emptyNodes() {
assertEquals("{}", JSONWriter.toString(new DataNode(DataNode.DataType.Map)));
assertEquals("[]", JSONWriter.toString(new DataNode(DataNode.DataType.List)));
}
@Test
public void escapeQuotes() {
DataNode node = new DataNode(DataNode.DataType.List);
node.add("aa \"bb\" cc");
assertEquals("[\"aa \\\"bb\\\" cc\"]", JSONWriter.toString(node));
}
}