Skip to content

Commit beee1c2

Browse files
committed
Change IOStream._read_buffer from cStringIO to a deque.
This change is mainly for consistency with the _write_buffer change.
1 parent d91f5dc commit beee1c2

File tree

1 file changed

+12
-10
lines changed

1 file changed

+12
-10
lines changed

tornado/iostream.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import errno
2323
import logging
2424
import socket
25-
from cStringIO import StringIO
25+
import sys
2626

2727
from tornado import ioloop
2828
from tornado import stack_context
@@ -83,7 +83,7 @@ def __init__(self, socket, io_loop=None, max_buffer_size=104857600,
8383
self.io_loop = io_loop or ioloop.IOLoop.instance()
8484
self.max_buffer_size = max_buffer_size
8585
self.read_chunk_size = read_chunk_size
86-
self._read_buffer = StringIO()
86+
self._read_buffer = collections.deque()
8787
self._write_buffer = collections.deque()
8888
self._read_delimiter = None
8989
self._read_bytes = None
@@ -292,8 +292,8 @@ def _read_to_buffer(self):
292292
raise
293293
if chunk is None:
294294
return 0
295-
self._read_buffer.write(chunk)
296-
if self._read_buffer.tell() >= self.max_buffer_size:
295+
self._read_buffer.append(chunk)
296+
if self._read_buffer_size() >= self.max_buffer_size:
297297
logging.error("Reached maximum read buffer size")
298298
self.close()
299299
raise IOError("Reached maximum read buffer size")
@@ -305,15 +305,16 @@ def _read_from_buffer(self):
305305
Returns True if the read was completed.
306306
"""
307307
if self._read_bytes:
308-
if self._read_buffer.tell() >= self._read_bytes:
308+
if self._read_buffer_size() >= self._read_bytes:
309309
num_bytes = self._read_bytes
310310
callback = self._read_callback
311311
self._read_callback = None
312312
self._read_bytes = None
313313
self._run_callback(callback, self._consume(num_bytes))
314314
return True
315315
elif self._read_delimiter:
316-
loc = self._read_buffer.getvalue().find(self._read_delimiter)
316+
_merge_prefix(self._read_buffer, sys.maxint)
317+
loc = self._read_buffer[0].find(self._read_delimiter)
317318
if loc != -1:
318319
callback = self._read_callback
319320
delimiter_len = len(self._read_delimiter)
@@ -355,10 +356,8 @@ def _handle_write(self):
355356
self._run_callback(callback)
356357

357358
def _consume(self, loc):
358-
buffered_string = self._read_buffer.getvalue()
359-
self._read_buffer = StringIO()
360-
self._read_buffer.write(buffered_string[loc:])
361-
return buffered_string[:loc]
359+
_merge_prefix(self._read_buffer, loc)
360+
return self._read_buffer.popleft()
362361

363362
def _check_closed(self):
364363
if not self.socket:
@@ -372,6 +371,9 @@ def _add_io_state(self, state):
372371
self._state = self._state | state
373372
self.io_loop.update_handler(self.socket.fileno(), self._state)
374373

374+
def _read_buffer_size(self):
375+
return sum(len(chunk) for chunk in self._read_buffer)
376+
375377

376378
class SSLIOStream(IOStream):
377379
"""A utility class to write to and read from a non-blocking socket.

0 commit comments

Comments
 (0)