Allow IQ processing based on only id value before the session is bound.

See issue #278
This commit is contained in:
Lance Stout 2014-02-14 13:50:21 -08:00
parent 543250da13
commit 7cf55ef695
2 changed files with 13 additions and 9 deletions

View File

@ -9,7 +9,7 @@
from sleekxmpp.stanza.rootstanza import RootStanza from sleekxmpp.stanza.rootstanza import RootStanza
from sleekxmpp.xmlstream import StanzaBase, ET from sleekxmpp.xmlstream import StanzaBase, ET
from sleekxmpp.xmlstream.handler import Waiter, Callback from sleekxmpp.xmlstream.handler import Waiter, Callback
from sleekxmpp.xmlstream.matcher import MatchIDSender from sleekxmpp.xmlstream.matcher import MatchIDSender, MatcherId
from sleekxmpp.exceptions import IqTimeout, IqError from sleekxmpp.exceptions import IqTimeout, IqError
@ -194,11 +194,14 @@ class Iq(RootStanza):
if timeout is None: if timeout is None:
timeout = self.stream.response_timeout timeout = self.stream.response_timeout
criteria = { if self.stream.session_bind_event.is_set():
matcher = MatchIDSender({
'id': self['id'], 'id': self['id'],
'self': self.stream.boundjid, 'self': self.stream.boundjid,
'peer': self['to'] 'peer': self['to']
} })
else:
matcher = MatcherId(self['id'])
if callback is not None and self['type'] in ('get', 'set'): if callback is not None and self['type'] in ('get', 'set'):
handler_name = 'IqCallback_%s' % self['id'] handler_name = 'IqCallback_%s' % self['id']
@ -210,19 +213,19 @@ class Iq(RootStanza):
self._fire_timeout, self._fire_timeout,
repeat=False) repeat=False)
handler = Callback(handler_name, handler = Callback(handler_name,
MatchIDSender(criteria), matcher,
self._handle_result, self._handle_result,
once=True) once=True)
else: else:
handler = Callback(handler_name, handler = Callback(handler_name,
MatchIDSender(criteria), matcher,
callback, callback,
once=True) once=True)
self.stream.register_handler(handler) self.stream.register_handler(handler)
StanzaBase.send(self, now=now) StanzaBase.send(self, now=now)
return handler_name return handler_name
elif block and self['type'] in ('get', 'set'): elif block and self['type'] in ('get', 'set'):
waitfor = Waiter('IqWait_%s' % self['id'], MatchIDSender(criteria)) waitfor = Waiter('IqWait_%s' % self['id'], matcher)
self.stream.register_handler(waitfor) self.stream.register_handler(waitfor)
StanzaBase.send(self, now=now) StanzaBase.send(self, now=now)
result = waitfor.wait(timeout) result = waitfor.wait(timeout)

View File

@ -376,6 +376,7 @@ class SleekTest(unittest.TestCase):
if skip: if skip:
if socket != 'live': if socket != 'live':
# Mark send queue as usable # Mark send queue as usable
self.xmpp.session_bind_event.set()
self.xmpp.session_started_event.set() self.xmpp.session_started_event.set()
# Clear startup stanzas # Clear startup stanzas
self.xmpp.socket.next_sent(timeout=1) self.xmpp.socket.next_sent(timeout=1)