Fix RESPONSE_TIMEOUT dependency loops.

This commit is contained in:
Lance Stout 2010-11-17 15:13:09 -05:00
parent b8114b25ed
commit 6ee8a2980c
3 changed files with 20 additions and 8 deletions

View file

@ -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 <iq> 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)

View file

@ -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:

View file

@ -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):