diff --git a/src/java/org/jivesoftware/multiplexer/net/XMLLightweightParser.java b/src/java/org/jivesoftware/multiplexer/net/XMLLightweightParser.java
index e07916f..0170d74 100644
--- a/src/java/org/jivesoftware/multiplexer/net/XMLLightweightParser.java
+++ b/src/java/org/jivesoftware/multiplexer/net/XMLLightweightParser.java
@@ -195,14 +195,17 @@
} else if (status == XMLLightweightParser.VERIFY_CLOSE_TAG) {
if (ch == '>') {
depth--;
- }
- if (depth < 1) {
- // Found a tag in the form
- int end = buffer.length() - readByte + (i + 1);
- String msg = buffer.substring(startLastMsg, end);
- // Add message to the list
- foundMsg(msg);
- startLastMsg = end;
+ if (depth < 1) {
+ // Found a tag in the form
+ int end = buffer.length() - readByte + (i + 1);
+ String msg = buffer.substring(startLastMsg, end);
+ // Add message to the list
+ foundMsg(msg);
+ startLastMsg = end;
+ }
+ } else if (ch == '<') {
+ status = XMLLightweightParser.PRETAIL;
+ insideChildrenTag = true;
} else {
status = XMLLightweightParser.INSIDE;
}
@@ -210,7 +213,6 @@
if (ch == '"') {
status = XMLLightweightParser.INSIDE;
- continue;
}
} else if (status == XMLLightweightParser.INSIDE_CDATA) {
if (ch == XMLLightweightParser.CDATA_END[cdataOffset]) {
@@ -218,7 +220,6 @@
if (cdataOffset == XMLLightweightParser.CDATA_END.length) {
status = XMLLightweightParser.INSIDE;
cdataOffset = 0;
- continue;
}
} else {
cdataOffset = 0;
diff --git a/test/org/jivesoftware/multiplexer/net/XMLLightweightParserTest.java b/test/org/jivesoftware/multiplexer/net/XMLLightweightParserTest.java
index c623640..6bec743 100644
--- a/test/org/jivesoftware/multiplexer/net/XMLLightweightParserTest.java
+++ b/test/org/jivesoftware/multiplexer/net/XMLLightweightParserTest.java
@@ -201,6 +201,28 @@
assertFalse("Found messages in incomplete stanza", parser.areThereMsgs());
}
+ public void testStanzaWithSpecialChars() throws Exception {
+ String msg1 = "12/";
+ String msg2 = "12///";
+ String msg3 = "12/\\/";
+ String msg4 = "http://idetalk.com/namespace/";
+ in.putString(msg1, Charset.forName(CHARSET).newEncoder());
+ in.putString(msg2, Charset.forName(CHARSET).newEncoder());
+ in.putString(msg3, Charset.forName(CHARSET).newEncoder());
+ in.putString(msg4, Charset.forName(CHARSET).newEncoder());
+ in.flip();
+ // Fill parser with byte buffer content and parse it
+ parser.read(in);
+ // Make verifications
+ assertTrue("No messages were found in stanza", parser.areThereMsgs());
+ String[] values = parser.getMsgs();
+ assertEquals("Wrong number of parsed stanzas", 4, values.length);
+ assertEquals("Wrong stanza was parsed", msg1, values[0]);
+ assertEquals("Wrong stanza was parsed", msg2, values[1]);
+ assertEquals("Wrong stanza was parsed", msg3, values[2]);
+ assertEquals("Wrong stanza was parsed", msg4, values[3]);
+ }
+
public void testCompletedStanza() throws Exception {
String msg1 = "12";
in.putString(msg1, Charset.forName(CHARSET).newEncoder());