Cache stanza if sending fails.

The stanza will be sent first once the send queue is reactivated
after session start.

Stanzas sent by skipping the queue will not be cached.
This commit is contained in:
Lance Stout 2011-06-01 15:10:44 -07:00
parent a81162edd2
commit 1469323350

View file

@ -192,6 +192,7 @@ class XMLStream(object):
self.event_queue = queue.Queue()
self.send_queue = queue.Queue()
self.__failed_send_stanza = None
self.scheduler = Scheduler(self.event_queue, self.stop)
self.namespace_map = {StanzaBase.xml_ns: 'xml'}
@ -1021,16 +1022,21 @@ class XMLStream(object):
try:
while not self.stop.isSet():
self.session_started_event.wait()
try:
data = self.send_queue.get(True, 1)
except queue.Empty:
continue
if self.__failed_send_stanza is not None:
data = self.__failed_send_stanza
self.__failed_send_stanza = None
else:
try:
data = self.send_queue.get(True, 1)
except queue.Empty:
continue
log.debug("SEND: %s" % data)
try:
self.socket.send(data.encode('utf-8'))
except Socket.error as serr:
self.event('socket_error', serr)
log.warning("Failed to send %s" % data)
self.__failed_send_stanza = data
self.disconnect(self.auto_reconnect)
except KeyboardInterrupt:
log.debug("Keyboard Escape Detected in _send_thread")