Fixed additional JSON escaps and added tests
This commit is contained in:
parent
86296df176
commit
670f95689d
5 changed files with 57 additions and 12 deletions
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -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,]");
|
||||||
|
|
|
||||||
22
test/zutil/parser/json/JSONWriterTest.java
Normal file
22
test/zutil/parser/json/JSONWriterTest.java
Normal 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));
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue