import urllib2 as urllib_error
import json
from ssl import SSLError
+import socket
from .api import TwitterCall, wrap_response
def __iter__(self):
sock = self.handle.fp._sock.fp._sock
+ sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
if not self.block:
sock.setblocking(False)
while True:
return iter(TwitterJSONIter(handle, uri, arg_data, block))
class TwitterStreamCall(TwitterCall):
- def _handle_response(self, req, uri, arg_data):
+ def _handle_response(self, req, uri, arg_data, _timeout=None):
return handle_stream_response(req, uri, arg_data, block=True)
class TwitterStreamCallNonBlocking(TwitterCall):
- def _handle_response(self, req, uri, arg_data):
+ def _handle_response(self, req, uri, arg_data, _timeout=None):
return handle_stream_response(req, uri, arg_data, block=False)
class TwitterStream(TwitterStreamCall):
"""
- Interface to the Twitter Stream API (stream.twitter.com). This can
- be used pretty much the same as the Twitter class except the
- result of calling a method will be an iterator that yields objects
- decoded from the stream. For example::
+ The TwitterStream object is an interface to the Twitter Stream API
+ (stream.twitter.com). This can be used pretty much the same as the
+ Twitter class except the result of calling a method will be an
+ iterator that yields objects decoded from the stream. For
+ example::
twitter_stream = TwitterStream(auth=UserPassAuth('joe', 'joespassword'))
iterator = twitter_stream.statuses.sample()
The iterator will yield tweets forever and ever (until the stream
breaks at which point it raises a TwitterHTTPError.)
- The `block` paramater controls if the stream is blocking. Default
+ The `block` parameter controls if the stream is blocking. Default
is blocking (True). When set to False, the iterator will
occasionally yield None when there is no available message.
"""