X-Git-Url: https://jfr.im/git/z_archive/twitter.git/blobdiff_plain/43778459d292186d3055fef60a21e8ad562b6d13..c2176d4e0365bb0764ff6962721053acaa1d1e39:/twitter/stream.py?ds=sidebyside diff --git a/twitter/stream.py b/twitter/stream.py index 3ea9c69..6a7753a 100644 --- a/twitter/stream.py +++ b/twitter/stream.py @@ -1,3 +1,6 @@ +# encoding: utf-8 +from __future__ import unicode_literals + import sys PY_3_OR_HIGHER = sys.version_info >= (3, 0) @@ -16,7 +19,8 @@ import sys, select, time from .api import TwitterCall, wrap_response, TwitterHTTPError CRLF = b'\r\n' -MIN_TIMEOUT = 0.0 # Apparenty select with zero wait is okay! +MIN_SOCK_TIMEOUT = 0.0 # Apparenty select with zero wait is okay! +MAX_SOCK_TIMEOUT = 10.0 HEARTBEAT_TIMEOUT = 90.0 Timeout = {'timeout': True} @@ -24,8 +28,6 @@ Hangup = {'hangup': True} DecodeError = {'hangup': True, 'decode_error': True} HeartbeatTimeout = {'hangup': True, 'heartbeat_timeout': True} -range = range if PY_3_OR_HIGHER else xrange - class HttpChunkDecoder(object): @@ -82,7 +84,7 @@ class HttpChunkDecoder(object): class JsonDecoder(object): def __init__(self): - self.buf = u"" + self.buf = "" self.raw_decode = json.JSONDecoder().raw_decode def decode(self, data): @@ -146,18 +148,20 @@ class TwitterJSONIter(object): self.uri = uri self.arg_data = arg_data self.timeout_token = Timeout - self.timeout = HEARTBEAT_TIMEOUT + self.timeout = None self.heartbeat_timeout = HEARTBEAT_TIMEOUT if timeout and timeout > 0: self.timeout = float(timeout) elif not (block or timeout): self.timeout_token = None - self.timeout = MIN_TIMEOUT + self.timeout = MIN_SOCK_TIMEOUT if heartbeat_timeout and heartbeat_timeout > 0: self.heartbeat_timeout = float(heartbeat_timeout) def __iter__(self): - sock_timeout = min(self.timeout, self.heartbeat_timeout) + timeouts = [t for t in (self.timeout, self.heartbeat_timeout, MAX_SOCK_TIMEOUT) + if t is not None] + sock_timeout = min(*timeouts) sock = self.handle.fp.raw._sock if PY_3_OR_HIGHER else self.handle.fp._sock.fp._sock sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) headers = self.handle.headers @@ -172,8 +176,8 @@ class TwitterJSONIter(object): # Decode all the things: data = sock_reader.read() dechunked_data, end_of_stream, decode_error = chunk_decoder.decode(data) - utf8_data = utf8_decoder.decode(dechunked_data) - json_data = json_decoder.decode(utf8_data) + unicode_data = utf8_decoder.decode(dechunked_data) + json_data = json_decoder.decode(unicode_data) # Yield data-like things: for json_obj in json_data: