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());