4040# processed a whole event, which could in theory be slightly more efficient
4141# than the internal bytearray support.)
4242
43- default_delimiter = b"\n \r ?\n "
44- delimiter_regex = re .compile (b"\n \r ?\n " , re .MULTILINE )
43+ body_and_headers_delimiter_regex = re .compile (b"\n \r ?\n " , re .MULTILINE )
4544line_delimiter_regex = re .compile (b"\r ?\n " , re .MULTILINE )
4645
4746
@@ -51,8 +50,7 @@ def __init__(self):
5150 # These are both absolute offsets into self._data:
5251 self ._start = 0
5352 self ._looked_at = 0
54- self ._looked_for = default_delimiter
55- self ._looked_for_regex = delimiter_regex
53+ self ._looked_for_regex = body_and_headers_delimiter_regex
5654
5755 def __bool__ (self ):
5856 return bool (len (self ))
@@ -87,19 +85,14 @@ def maybe_extract_at_most(self, count):
8785 self ._start += len (out )
8886 return out
8987
90- def maybe_extract_until_next (self , needle ):
88+ def maybe_extract_until_next (self , needle_regex , max_needle_length ):
9189 # Returns extracted bytes on success (advancing offset), or None on
9290 # failure
93- if self ._looked_for == needle :
94- looked_at = max (self ._start , self ._looked_at - len ( needle ) + 1 )
91+ if self ._looked_for_regex == needle_regex :
92+ looked_at = max (self ._start , self ._looked_at - max_needle_length )
9593 else :
9694 looked_at = self ._start
97- self ._looked_for = needle
98- # Check if default delimiter to avoid expensive re.compile
99- if needle == default_delimiter :
100- self ._looked_for_regex = delimiter_regex
101- else :
102- self ._looked_for_regex = re .compile (needle , re .MULTILINE )
95+ self ._looked_for_regex = needle_regex
10396
10497 delimiter_match = next (
10598 self ._looked_for_regex .finditer (self ._data , looked_at ), None
@@ -136,11 +129,11 @@ def maybe_extract_lines(self):
136129 self ._start += len (start_chunk )
137130 return []
138131 else :
139- data = self .maybe_extract_until_next (default_delimiter )
132+ data = self .maybe_extract_until_next (body_and_headers_delimiter_regex , 3 )
140133 if data is None :
141134 return None
142135
143- delimiter = self ._get_fields_delimiter (data , line_delimiter_regex )
144- lines = data .rstrip (b"\r \n " ).split (delimiter )
136+ real_lines_delimiter = self ._get_fields_delimiter (data , line_delimiter_regex )
137+ lines = data .rstrip (b"\r \n " ).split (real_lines_delimiter )
145138
146139 return lines
0 commit comments