Ticket #125 (assigned defect)

Opened 11 months ago

Last modified 4 months ago

deal with Segmented long xml stanza in javascript XMLReader parser

Reported by: bug Owned by: desmaj
Priority: major Milestone: Orbited 0.7.11
Component: Orbited JavaScript Version: Orbited 0.7.10
Keywords: Cc:

Description

when xmpp server send Segmented long xml stanza to orbited client in javascript XMLReader parser,
Suppose user "terry" has 2000 roster user
when user "terry" login and get roster. the server will send such as

first orbited client received:

<iq from='terry@domain/Orbited' to='terry@domain/Orbited' type='result'><query xmlns='jabber:iq:roster'><item subscription='both' jid='1@domain'/><item subscription='both' jid='2@domain'/><item subscription='both' jid='3@domain'/> ... <item subscription='both' jid='1000@domain'/><item subscription='both' ,1218

second orbited client received:

jid='1001@domain'/> ... <item subscription='both' jid='2000@domain'/></query></iq>

in this case "xmpp.js" XMLReader private function separate_events should change
from

        while (i != -1) {
            if (buff.slice(i-2-name.length,i+1) == "</"+name+">") {
                var frame = parse(buff.slice(0, i+1)).firstChild;
                if (frame.nodeName == "parsererror") {
                    var frame = parse(buff.slice(0, i+1).replace("&","&amp;")).firstChild;
                }
                buff = buff.slice(i+1);
                checked = 0;
                name = null;
                cb(frame);
                return separate_events();
            }
            else {
                checked = i+1;
                i = buff.indexOf(">", checked);
            }
        }
    }

to

        while (i != -1) {
            if (buff.slice(i-2-name.length,i+1) == "</"+name+">") {
                var frame = parse(buff.slice(0, i+1)).firstChild;
                if (frame.nodeName == "parsererror") {
                    var frame = parse(buff.slice(0, i+1).replace("&","&amp;")).firstChild;
                }
                buff = buff.slice(i+1);
                checked = 0;
                name = null;
                cb(frame);
                return separate_events();
            }
            else {
                checked = i+1;
                i = buff.indexOf(">", checked);
		if(i==-1)buff = buff.slice(0,buff.lastIndexOf(",")) // add this line
            }
        }
    }

Change History

Changed 4 months ago by desmaj

  • owner set to desmaj
  • status changed from new to assigned
  • version set to Orbited 0.7.10
  • milestone changed from Orbited 0.7 to Orbited 0.7.11
Note: See TracTickets for help on using tickets.