summaryrefslogtreecommitdiff
path: root/sleekxmpp/xmlstream
diff options
context:
space:
mode:
Diffstat (limited to 'sleekxmpp/xmlstream')
-rw-r--r--sleekxmpp/xmlstream/xmlstream.py13
1 files changed, 10 insertions, 3 deletions
diff --git a/sleekxmpp/xmlstream/xmlstream.py b/sleekxmpp/xmlstream/xmlstream.py
index 00af3d2e..7098e1c1 100644
--- a/sleekxmpp/xmlstream/xmlstream.py
+++ b/sleekxmpp/xmlstream/xmlstream.py
@@ -47,6 +47,7 @@ stanza_extensions = {}
RECONNECT_MAX_DELAY = 3600
RECONNECT_QUIESCE_FACTOR = 1.6180339887498948 # Phi
RECONNECT_QUIESCE_JITTER = 0.11962656472 # molar Planck constant times c, joule meter/mole
+DEFAULT_KEEPALIVE = 300 # send a single byte every 5 minutes
class XMLStream(object):
"A connection manager with XML events."
@@ -74,6 +75,9 @@ class XMLStream(object):
self.use_tls = False
self.ca_certs=None
+ self.keep_alive = DEFAULT_KEEPALIVE
+ self._last_sent_time = time.time()
+
self.stream_header = "<stream>"
self.stream_footer = "</stream>"
@@ -290,9 +294,12 @@ class XMLStream(object):
data = self.sendqueue.get(True,5)[1]
logging.debug("SEND: %s" % data)
self.socket.sendall(data.encode('utf-8'))
- except queue.Empty:
-# logging.debug('Nothing on send queue')
- pass
+ self._last_sent_time = time.time()
+ except queue.Empty: # send keep-alive if necessary
+ now = time.time()
+ if self._last_sent_time + self.keep_alive < now:
+ self.socket.sendall(' ')
+ self._last_sent_time = time.time()
except socket.timeout:
# this is to prevent a thread blocked indefinitely
logging.debug('timeout sending packet data')