Merge branch 'develop' of github.com:fritzy/SleekXMPP into roster
This commit is contained in:
@@ -383,7 +383,7 @@ class ClientXMPP(BaseXMPP):
|
||||
self.set_jid(response.xml.find('{%s}bind/{%s}jid' % (bind_ns,
|
||||
bind_ns)).text)
|
||||
self.bound = True
|
||||
log.info("Node set to: %s" % self.boundjid.fulljid)
|
||||
log.info("Node set to: %s" % self.boundjid.full)
|
||||
session_ns = 'urn:ietf:params:xml:ns:xmpp-session'
|
||||
if "{%s}session" % session_ns not in self.features or self.bindfail:
|
||||
log.debug("Established Session")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
"""
|
||||
|
||||
import socket
|
||||
import threading
|
||||
try:
|
||||
import queue
|
||||
except ImportError:
|
||||
@@ -40,6 +41,8 @@ class TestLiveSocket(object):
|
||||
self.recv_buffer = []
|
||||
self.recv_queue = queue.Queue()
|
||||
self.send_queue = queue.Queue()
|
||||
self.send_queue_lock = threading.Lock()
|
||||
self.recv_queue_lock = threading.Lock()
|
||||
self.is_live = True
|
||||
|
||||
def __getattr__(self, name):
|
||||
@@ -108,7 +111,8 @@ class TestLiveSocket(object):
|
||||
Placeholders. Same as for socket.recv.
|
||||
"""
|
||||
data = self.socket.recv(*args, **kwargs)
|
||||
self.recv_queue.put(data)
|
||||
with self.recv_queue_lock:
|
||||
self.recv_queue.put(data)
|
||||
return data
|
||||
|
||||
def send(self, data):
|
||||
@@ -120,7 +124,8 @@ class TestLiveSocket(object):
|
||||
Arguments:
|
||||
data -- String value to write.
|
||||
"""
|
||||
self.send_queue.put(data)
|
||||
with self.send_queue_lock:
|
||||
self.send_queue.put(data)
|
||||
self.socket.send(data)
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
@@ -143,3 +148,15 @@ class TestLiveSocket(object):
|
||||
Placeholders, same as socket.recv()
|
||||
"""
|
||||
return self.recv(*args, **kwargs)
|
||||
|
||||
def clear(self):
|
||||
"""
|
||||
Empty the send queue, typically done once the session has started to
|
||||
remove the feature negotiation and log in stanzas.
|
||||
"""
|
||||
with self.send_queue_lock:
|
||||
for i in range(0, self.send_queue.qsize()):
|
||||
self.send_queue.get(block=False)
|
||||
with self.recv_queue_lock:
|
||||
for i in range(0, self.recv_queue.qsize()):
|
||||
self.recv_queue.get(block=False)
|
||||
|
||||
@@ -7,6 +7,10 @@
|
||||
"""
|
||||
|
||||
import unittest
|
||||
try:
|
||||
import Queue as queue
|
||||
except:
|
||||
import queue
|
||||
|
||||
import sleekxmpp
|
||||
from sleekxmpp import ClientXMPP, ComponentXMPP
|
||||
@@ -219,7 +223,10 @@ class SleekTest(unittest.TestCase):
|
||||
"Stanza:\n%s" % str(stanza))
|
||||
else:
|
||||
stanza_class = stanza.__class__
|
||||
xml = self.parse_xml(criteria)
|
||||
if isinstance(criteria, str):
|
||||
xml = self.parse_xml(criteria)
|
||||
else:
|
||||
xml = criteria.xml
|
||||
|
||||
# Ensure that top level namespaces are used, even if they
|
||||
# were not provided.
|
||||
@@ -305,6 +312,10 @@ class SleekTest(unittest.TestCase):
|
||||
else:
|
||||
raise ValueError("Unknown XMPP connection mode.")
|
||||
|
||||
# We will use this to wait for the session_start event
|
||||
# for live connections.
|
||||
skip_queue = queue.Queue()
|
||||
|
||||
if socket == 'mock':
|
||||
self.xmpp.set_socket(TestSocket())
|
||||
|
||||
@@ -319,6 +330,10 @@ class SleekTest(unittest.TestCase):
|
||||
self.xmpp.socket.recv_data(header)
|
||||
elif socket == 'live':
|
||||
self.xmpp.socket_class = TestLiveSocket
|
||||
def wait_for_session(x):
|
||||
self.xmpp.socket.clear()
|
||||
skip_queue.put('started')
|
||||
self.xmpp.add_event_handler('session_start', wait_for_session)
|
||||
self.xmpp.connect()
|
||||
else:
|
||||
raise ValueError("Unknown socket type.")
|
||||
@@ -326,10 +341,13 @@ class SleekTest(unittest.TestCase):
|
||||
self.xmpp.register_plugins()
|
||||
self.xmpp.process(threaded=True)
|
||||
if skip:
|
||||
# Clear startup stanzas
|
||||
self.xmpp.socket.next_sent(timeout=1)
|
||||
if mode == 'component':
|
||||
if socket != 'live':
|
||||
# Clear startup stanzas
|
||||
self.xmpp.socket.next_sent(timeout=1)
|
||||
if mode == 'component':
|
||||
self.xmpp.socket.next_sent(timeout=1)
|
||||
else:
|
||||
skip_queue.get(block=True, timeout=10)
|
||||
|
||||
def make_header(self, sto='',
|
||||
sfrom='',
|
||||
@@ -599,11 +617,12 @@ class SleekTest(unittest.TestCase):
|
||||
Defaults to the value of self.match_method.
|
||||
"""
|
||||
sent = self.xmpp.socket.next_sent(timeout)
|
||||
if isinstance(data, str):
|
||||
xml = self.parse_xml(data)
|
||||
self.fix_namespaces(xml, 'jabber:client')
|
||||
data = self.xmpp._build_stanza(xml, 'jabber:client')
|
||||
self.check(data, sent,
|
||||
if sent is None:
|
||||
return False
|
||||
xml = self.parse_xml(sent)
|
||||
self.fix_namespaces(xml, 'jabber:client')
|
||||
sent = self.xmpp._build_stanza(xml, 'jabber:client')
|
||||
self.check(sent, data,
|
||||
method=method,
|
||||
defaults=defaults,
|
||||
use_values=use_values)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -121,3 +121,6 @@ class JID(object):
|
||||
def __str__(self):
|
||||
"""Use the full JID as the string value."""
|
||||
return self.full
|
||||
|
||||
def __repr__(self):
|
||||
return str(self)
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user