Hi,
I’'ve discovered a bug in Smack. When receiving XHTML messages, Smack decodes the entities in the message, generating potentally invalid XML and making reconstruction impossible.
For example: I received a message containing:
bi bo bu
When I call getBodies().next(), I receive the following string:
bi bu
I isolated a fix and generated a patch (it’'s basically just a string search/replace):
— source/org/jivesoftware/smackx/provider/XHTMLExtensionProvider.java 2006-06-12 23:13:14.000000000 +0200
+++ …/smack-dev-2.2.1_fixed/source/org/jivesoftware/smackx/provider/XHTMLExtension Provider.java 2006-06-21 16:26:02.000000000 +0200
@@ -43,29 +43,47 @@
- Parses a XHTMLExtension packet (extension sub-packet).
-
@param parser the XML parser, positioned at the starting element of the extension.
-
@return a PacketExtension.
-
@throws Exception if a parsing error occurs.
*/
public PacketExtension parseExtension(XmlPullParser parser)
throws Exception {
XHTMLExtension xhtmlExtension = new XHTMLExtension();
boolean done = false;
StringBuffer buffer = new StringBuffer();;
while (!done) {
int eventType = parser.next();
if (eventType == XmlPullParser.START_TAG) {
if (parser.getName().equals(“body”))
buffer = new StringBuffer();
buffer.append(parser.getText());
} else if (eventType == XmlPullParser.TEXT) {
-
if (buffer != null) buffer.append(parser.getText());
-
StringBuffer text = new StringBuffer(parser.getText());
-
int loc = 0;
-
while((loc = text.indexOf("&",loc)) != -1) {
-
text.replace(loc,loc+1,"&");
-
loc += 4;
-
}
-
loc = 0;
-
while((loc = text.indexOf("<",loc)) != -1) {
-
text.replace(loc,loc+1,"<");
-
loc += 3;
-
}
-
loc = 0;
-
while((loc = text.indexOf(">",loc)) != -1) {
-
text.replace(loc,loc+1,">");
-
loc += 3;
-
}
-
if (buffer != null) buffer.append(text);
} else if (eventType == XmlPullParser.END_TAG) {
if (parser.getName().equals(“body”)) {
buffer.append(parser.getText());
xhtmlExtension.addBody(buffer.toString());
}
else if (parser.getName().equals(xhtmlExtension.getElementName())) {
done = true;
}
else
buffer.append(parser.getText());
(I’'m sorry for the formatting)
Message was edited by: AWenckus