22
22
import errno
23
23
import logging
24
24
import socket
25
- from cStringIO import StringIO
25
+ import sys
26
26
27
27
from tornado import ioloop
28
28
from tornado import stack_context
@@ -83,7 +83,7 @@ def __init__(self, socket, io_loop=None, max_buffer_size=104857600,
83
83
self .io_loop = io_loop or ioloop .IOLoop .instance ()
84
84
self .max_buffer_size = max_buffer_size
85
85
self .read_chunk_size = read_chunk_size
86
- self ._read_buffer = StringIO ()
86
+ self ._read_buffer = collections . deque ()
87
87
self ._write_buffer = collections .deque ()
88
88
self ._read_delimiter = None
89
89
self ._read_bytes = None
@@ -292,8 +292,8 @@ def _read_to_buffer(self):
292
292
raise
293
293
if chunk is None :
294
294
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 :
297
297
logging .error ("Reached maximum read buffer size" )
298
298
self .close ()
299
299
raise IOError ("Reached maximum read buffer size" )
@@ -305,15 +305,16 @@ def _read_from_buffer(self):
305
305
Returns True if the read was completed.
306
306
"""
307
307
if self ._read_bytes :
308
- if self ._read_buffer . tell () >= self ._read_bytes :
308
+ if self ._read_buffer_size () >= self ._read_bytes :
309
309
num_bytes = self ._read_bytes
310
310
callback = self ._read_callback
311
311
self ._read_callback = None
312
312
self ._read_bytes = None
313
313
self ._run_callback (callback , self ._consume (num_bytes ))
314
314
return True
315
315
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 )
317
318
if loc != - 1 :
318
319
callback = self ._read_callback
319
320
delimiter_len = len (self ._read_delimiter )
@@ -355,10 +356,8 @@ def _handle_write(self):
355
356
self ._run_callback (callback )
356
357
357
358
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 ()
362
361
363
362
def _check_closed (self ):
364
363
if not self .socket :
@@ -372,6 +371,9 @@ def _add_io_state(self, state):
372
371
self ._state = self ._state | state
373
372
self .io_loop .update_handler (self .socket .fileno (), self ._state )
374
373
374
+ def _read_buffer_size (self ):
375
+ return sum (len (chunk ) for chunk in self ._read_buffer )
376
+
375
377
376
378
class SSLIOStream (IOStream ):
377
379
"""A utility class to write to and read from a non-blocking socket.
0 commit comments