Modified xmlstream.py to pass a clean stanza object to each stream handler.

The previous version passed the same stanza object to each registered handler,
which can cause issues when the stanza object is modified by one handler. The next
handler receives the stanza with the modifications, not the original stanza.
This commit is contained in:
Lance Stout 2010-06-03 22:42:11 -04:00
parent e700a54d11
commit 253de8518c

View file

@ -21,6 +21,7 @@ import threading
import time import time
import traceback import traceback
import types import types
import copy
import xml.sax.saxutils import xml.sax.saxutils
from . import scheduler from . import scheduler
@ -305,19 +306,18 @@ class XMLStream(object):
#convert XML into Stanza #convert XML into Stanza
logging.debug("RECV: %s" % cElementTree.tostring(xmlobj)) logging.debug("RECV: %s" % cElementTree.tostring(xmlobj))
xmlobj = self.incoming_filter(xmlobj) xmlobj = self.incoming_filter(xmlobj)
stanza = None stanza_type = StanzaBase
for stanza_class in self.__root_stanza: for stanza_class in self.__root_stanza:
if xmlobj.tag == "{%s}%s" % (self.default_ns, stanza_class.name): if xmlobj.tag == "{%s}%s" % (self.default_ns, stanza_class.name):
#if self.__root_stanza[stanza_class].match(xmlobj): stanza_type = stanza_class
stanza = stanza_class(self, xmlobj)
break break
if stanza is None:
stanza = StanzaBase(self, xmlobj)
unhandled = True unhandled = True
stanza = stanza_type(self, xmlobj)
for handler in self.__handlers: for handler in self.__handlers:
if handler.match(stanza): if handler.match(stanza):
handler.prerun(stanza) stanza_copy = stanza_type(self, copy.deepcopy(xmlobj))
self.eventqueue.put(('stanza', handler, stanza)) handler.prerun(stanza_copy)
self.eventqueue.put(('stanza', handler, stanza_copy))
if handler.checkDelete(): self.__handlers.pop(self.__handlers.index(handler)) if handler.checkDelete(): self.__handlers.pop(self.__handlers.index(handler))
unhandled = False unhandled = False
if unhandled: if unhandled: