From a6d701d754e055b556368ae756addb4728712b15 Mon Sep 17 00:00:00 2001 From: Dan Fairs Date: Tue, 31 Jan 2012 15:47:38 +0000 Subject: [PATCH] Use a buffer rather than reading the Twitter response one byte at a time. This actually respects the buffer_size option that was already there, but unused. --- tweepy/streaming.py | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/tweepy/streaming.py b/tweepy/streaming.py index 2e5c7e806..60b043c2d 100644 --- a/tweepy/streaming.py +++ b/tweepy/streaming.py @@ -135,23 +135,31 @@ def _run(self): if exception: raise + def _data(self, data): + for d in [dt for dt in data.split('\n') if dt]: + if self.listener.on_data(d) is False: + self.running = False + def _read_loop(self, resp): - while self.running: + while self.running: if resp.isclosed(): break - # read length - data = '' + buf = '' while True: - c = resp.read(1) - if c == '\n': - break - data += c - data = data.strip() - - # read data and pass into listener - if self.listener.on_data(data) is False: - self.running = False + c = resp.read(self.buffer_size) + idx = c.rfind('\n') + if idx > -1: + # There is an index. Store the tail part for later, + # and process the head part as messages. We use idx + 1 + # as we dont' actually want to store the newline. + data = buf + c[:idx] + buf = c[idx + 1:] + self._data(data) + else: + # No newline found, so we add this to our accumulated + # buffer + buf += c def _start(self, async): self.running = True