from socket import timeout
from threading import Thread
from time import sleep
+import ssl
from tweepy.models import Status
from tweepy.api import API
"""Called when a new status arrives"""
return
+ def on_exception(self, exception):
+ """Called when an unhandled exception occurs."""
+ return
+
def on_delete(self, status_id, user_id):
"""Called when a delete notice arrives for a status"""
return
self.running = False
self.timeout = options.get("timeout", 300.0)
self.retry_count = options.get("retry_count")
- self.retry_time = options.get("retry_time", 10.0)
- self.snooze_time = options.get("snooze_time", 5.0)
+ self.retry_time_start = options.get("retry_time", 10.0)
+ self.retry_time_cap = options.get("retry_time_cap", 240.0)
+ self.snooze_time_start = options.get("snooze_time", 0.25)
+ self.snooze_time_cap = options.get("snooze_time_cap", 16)
self.buffer_size = options.get("buffer_size", 1500)
if options.get("secure", True):
self.scheme = "https"
self.headers = options.get("headers") or {}
self.parameters = None
self.body = None
+ self.retry_time = self.retry_time_start
+ self.snooze_time = self.snooze_time_start
def _run(self):
# Authenticate
break
error_counter += 1
sleep(self.retry_time)
+ self.retry_time = min(self.retry_time * 2, self.retry_time_cap)
else:
error_counter = 0
+ self.retry_time = self.retry_time_start
+ self.snooze_time = self.snooze_time_start
self.listener.on_connect()
self._read_loop(resp)
- except timeout:
+ except (timeout, ssl.SSLError), exc:
+ # If it's not time out treat it like any other exception
+ if isinstance(exc, ssl.SSLError) and not (exc.args and 'timed out' in str(exc.args[0])):
+ exception = exc
+ break
+
if self.listener.on_timeout() == False:
break
if self.running is False:
break
conn.close()
sleep(self.snooze_time)
+ self.snooze_time = min(self.snooze_time+0.25, self.snooze_time_cap)
except Exception, exception:
# any other exception is fatal, so kill loop
break
conn.close()
if exception:
+ # call a handler first so that the exception can be logged.
+ self.listener.on_exception(exception)
raise
def _data(self, data):