From 6ee8a2980c2a7c9a8c65453b1d2c551717069ce5 Mon Sep 17 00:00:00 2001 From: Lance Stout Date: Wed, 17 Nov 2010 15:13:09 -0500 Subject: [PATCH] Fix RESPONSE_TIMEOUT dependency loops. --- sleekxmpp/stanza/iq.py | 6 ++++-- sleekxmpp/xmlstream/handler/waiter.py | 7 +++++-- sleekxmpp/xmlstream/xmlstream.py | 15 +++++++++++---- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/sleekxmpp/stanza/iq.py b/sleekxmpp/stanza/iq.py index 614d14f..150baa0 100644 --- a/sleekxmpp/stanza/iq.py +++ b/sleekxmpp/stanza/iq.py @@ -8,7 +8,7 @@ from sleekxmpp.stanza import Error from sleekxmpp.stanza.rootstanza import RootStanza -from sleekxmpp.xmlstream import RESPONSE_TIMEOUT, StanzaBase, ET +from sleekxmpp.xmlstream import StanzaBase, ET from sleekxmpp.xmlstream.handler import Waiter from sleekxmpp.xmlstream.matcher import MatcherId @@ -157,7 +157,7 @@ class Iq(RootStanza): StanzaBase.reply(self) return self - def send(self, block=True, timeout=RESPONSE_TIMEOUT): + def send(self, block=True, timeout=None): """ Send an stanza over the XML stream. @@ -174,6 +174,8 @@ class Iq(RootStanza): before exiting the send call if blocking is used. Defaults to sleekxmpp.xmlstream.RESPONSE_TIMEOUT """ + if timeout is None: + timeout = self.stream.response_timeout if block and self['type'] in ('get', 'set'): waitfor = Waiter('IqWait_%s' % self['id'], MatcherId(self['id'])) self.stream.registerHandler(waitfor) diff --git a/sleekxmpp/xmlstream/handler/waiter.py b/sleekxmpp/xmlstream/handler/waiter.py index a4bc354..341c01f 100644 --- a/sleekxmpp/xmlstream/handler/waiter.py +++ b/sleekxmpp/xmlstream/handler/waiter.py @@ -12,7 +12,7 @@ try: except ImportError: import Queue as queue -from sleekxmpp.xmlstream import StanzaBase, RESPONSE_TIMEOUT +from sleekxmpp.xmlstream import StanzaBase from sleekxmpp.xmlstream.handler.base import BaseHandler @@ -69,7 +69,7 @@ class Waiter(BaseHandler): """ pass - def wait(self, timeout=RESPONSE_TIMEOUT): + def wait(self, timeout=None): """ Block an event handler while waiting for a stanza to arrive. @@ -84,6 +84,9 @@ class Waiter(BaseHandler): arrive. Defaults to the global default timeout value sleekxmpp.xmlstream.RESPONSE_TIMEOUT. """ + if timeout is None: + timeout = self.stream.response_timeout + try: stanza = self._payload.get(True, timeout) except queue.Empty: diff --git a/sleekxmpp/xmlstream/xmlstream.py b/sleekxmpp/xmlstream/xmlstream.py index 30b76ce..9ae31a2 100644 --- a/sleekxmpp/xmlstream/xmlstream.py +++ b/sleekxmpp/xmlstream/xmlstream.py @@ -25,6 +25,8 @@ except ImportError: from sleekxmpp.thirdparty.statemachine import StateMachine from sleekxmpp.xmlstream import Scheduler, tostring from sleekxmpp.xmlstream.stanzabase import StanzaBase, ET +from sleekxmpp.xmlstream.handler import Waiter, XMLCallback +from sleekxmpp.xmlstream.matcher import MatchXMLMask # In Python 2.x, file socket objects are broken. A patched socket # wrapper is provided for this case in filesocket.py. @@ -162,6 +164,8 @@ class XMLStream(object): self.ssl_support = SSL_SUPPORT self.ssl_version = ssl.PROTOCOL_TLSv1 + self.response_timeout = RESPONSE_TIMEOUT + self.state = StateMachine(('disconnected', 'connected')) self.state._set_state('disconnected') @@ -458,8 +462,6 @@ class XMLStream(object): """ # To prevent circular dependencies, we must load the matcher # and handler classes here. - from sleekxmpp.xmlstream.matcher import MatchXMLMask - from sleekxmpp.xmlstream.handler import XMLCallback if name is None: name = 'add_handler_%s' % self.getNewId() @@ -606,7 +608,7 @@ class XMLStream(object): """ return xml - def send(self, data, mask=None, timeout=RESPONSE_TIMEOUT): + def send(self, data, mask=None, timeout=None): """ A wrapper for send_raw for sending stanza objects. @@ -621,6 +623,9 @@ class XMLStream(object): timeout -- Time in seconds to wait for a response before continuing. Defaults to RESPONSE_TIMEOUT. """ + if timeout is None: + timeout = self.response_timeout + if hasattr(mask, 'xml'): mask = mask.xml data = str(data) @@ -643,7 +648,7 @@ class XMLStream(object): self.send_queue.put(data) return True - def send_xml(self, data, mask=None, timeout=RESPONSE_TIMEOUT): + def send_xml(self, data, mask=None, timeout=None): """ Send an XML object on the stream, and optionally wait for a response. @@ -657,6 +662,8 @@ class XMLStream(object): timeout -- Time in seconds to wait for a response before continuing. Defaults to RESPONSE_TIMEOUT. """ + if timeout is None: + timeout = self.response_timeout return self.send(tostring(data), mask, timeout) def process(self, threaded=True):