Skip to content

Commit 15947cd

Browse files
cdelerpgjones
authored andcommitted
Tuned maybe_extract_next_line to search only \r\n
ref #115 (comment)
1 parent 7efb98b commit 15947cd

File tree

2 files changed

+17
-13
lines changed

2 files changed

+17
-13
lines changed

h11/_receivebuffer.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -86,14 +86,16 @@ def maybe_extract_next_line(self):
8686
Extract the first line, if it is completed in the buffer.
8787
"""
8888
# Only search in buffer space that we've not already looked at.
89-
partial_buffer = self._data[self._next_line_search :]
90-
partial_idx = partial_buffer.find(b"\n")
89+
search_start_index = max(0, self._next_line_search - 1)
90+
partial_buffer = self._data[search_start_index:]
91+
partial_idx = partial_buffer.find(b"\r\n")
9192
if partial_idx == -1:
9293
self._next_line_search = len(self._data)
9394
return None
9495

9596
# Truncate the buffer and return it.
96-
idx = self._next_line_search + partial_idx + 1
97+
# + 2 is to compensate len(b"\r\n")
98+
idx = search_start_index + partial_idx + 2
9799
out = self._data[:idx]
98100
self._data[:idx] = b""
99101
self._next_line_search = 0

h11/tests/test_receivebuffer.py

+12-10
Original file line numberDiff line numberDiff line change
@@ -35,26 +35,28 @@ def test_receivebuffer():
3535
# maybe_extract_until_next
3636
################################################################
3737

38-
b += b"12345\n6789\r\n"
38+
b += b"123\n456\r\n789\r\n"
3939

40-
assert b.maybe_extract_next_line() == b"12345\n"
41-
assert bytes(b) == b"6789\r\n"
40+
assert b.maybe_extract_next_line() == b"123\n456\r\n"
41+
assert bytes(b) == b"789\r\n"
4242

43-
assert b.maybe_extract_next_line() == b"6789\r\n"
43+
assert b.maybe_extract_next_line() == b"789\r\n"
4444
assert bytes(b) == b""
4545

4646
b += b"12\r"
4747
assert b.maybe_extract_next_line() is None
4848
assert bytes(b) == b"12\r"
4949

50-
# check repeated searches for the same needle, triggering the
51-
# pickup-where-we-left-off logic
5250
b += b"345\n\r"
53-
assert b.maybe_extract_next_line() == b"12\r345\n"
54-
assert bytes(b) == b"\r"
51+
assert b.maybe_extract_next_line() is None
52+
assert bytes(b) == b"12\r345\n\r"
53+
54+
# here we stopped at the middle of b"\r\n" delimiter
5555

56-
b += b"6789aaa123\n"
57-
assert b.maybe_extract_next_line() == b"\r6789aaa123\n"
56+
b += b"\n6789aaa123\r\n"
57+
assert b.maybe_extract_next_line() == b"12\r345\n\r\n"
58+
assert b.maybe_extract_next_line() == b"6789aaa123\r\n"
59+
assert b.maybe_extract_next_line() is None
5860
assert bytes(b) == b""
5961

6062
################################################################

0 commit comments

Comments
 (0)