Improves performance of http.body.Body.readline()

This commit is contained in:
Djoume Salvetti 2012-05-09 10:54:59 -04:00 committed by benoitc
parent 4b59fc351f
commit 9e308e317f
2 changed files with 70 additions and 13 deletions

View File

@ -228,24 +228,20 @@ class Body(object):
return ""
line = self.buf.getvalue()
self.buf.truncate(0)
if len(line) < size:
line += self.reader.read(size - len(line))
extra_buf_data = line[size:]
line = line[:size]
idx = line.find("\n")
if idx >= 0:
ret = line[:idx+1]
self.buf.truncate(0)
self.buf.write(line[idx+1:])
self.buf.write(extra_buf_data)
return ret
self.buf.truncate(0)
ch = ""
buf = [line]
lsize = len(line)
while lsize < size and ch != "\n":
ch = self.reader.read(1)
if not len(ch):
break
lsize += 1
buf.append(ch)
return "".join(buf)
self.buf.write(extra_buf_data)
return line
def readlines(self, size=None):
ret = []

View File

@ -0,0 +1,61 @@
from StringIO import StringIO
import t
from gunicorn.http.body import Body
def assert_readline(payload, size, expected):
body = Body(StringIO(payload))
t.eq(body.readline(size), expected)
def test_readline_empty_body():
assert_readline("", None, "")
assert_readline("", 1, "")
def test_readline_zero_size():
assert_readline("abc", 0, "")
assert_readline("\n", 0, "")
def test_readline_new_line_before_size():
body = Body(StringIO("abc\ndef"))
t.eq(body.readline(4), "abc\n")
t.eq(body.readline(), "def")
def test_readline_new_line_after_size():
body = Body(StringIO("abc\ndef"))
t.eq(body.readline(2), "ab")
t.eq(body.readline(), "c\n")
def test_readline_no_new_line():
body = Body(StringIO("abcdef"))
t.eq(body.readline(), "abcdef")
body = Body(StringIO("abcdef"))
t.eq(body.readline(2), "ab")
t.eq(body.readline(2), "cd")
t.eq(body.readline(2), "ef")
def test_readline_buffer_loaded():
reader = StringIO("abc\ndef")
body = Body(reader)
body.read(1) # load internal buffer
reader.write("g\nhi")
reader.seek(7)
t.eq(body.readline(), "bc\n")
t.eq(body.readline(), "defg\n")
t.eq(body.readline(), "hi")
def test_readline_buffer_loaded_with_size():
body = Body(StringIO("abc\ndef"))
body.read(1) # load internal buffer
t.eq(body.readline(2), "bc")
t.eq(body.readline(2), "\n")
t.eq(body.readline(2), "de")
t.eq(body.readline(2), "f")