40
40
# processed a whole event, which could in theory be slightly more efficient
41
41
# than the internal bytearray support.)
42
42
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 )
45
44
line_delimiter_regex = re .compile (b"\r ?\n " , re .MULTILINE )
46
45
47
46
@@ -51,8 +50,7 @@ def __init__(self):
51
50
# These are both absolute offsets into self._data:
52
51
self ._start = 0
53
52
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
56
54
57
55
def __bool__ (self ):
58
56
return bool (len (self ))
@@ -87,19 +85,14 @@ def maybe_extract_at_most(self, count):
87
85
self ._start += len (out )
88
86
return out
89
87
90
- def maybe_extract_until_next (self , needle ):
88
+ def maybe_extract_until_next (self , needle_regex , max_needle_length ):
91
89
# Returns extracted bytes on success (advancing offset), or None on
92
90
# 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 )
95
93
else :
96
94
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
103
96
104
97
delimiter_match = next (
105
98
self ._looked_for_regex .finditer (self ._data , looked_at ), None
@@ -136,11 +129,11 @@ def maybe_extract_lines(self):
136
129
self ._start += len (start_chunk )
137
130
return []
138
131
else :
139
- data = self .maybe_extract_until_next (default_delimiter )
132
+ data = self .maybe_extract_until_next (body_and_headers_delimiter_regex , 3 )
140
133
if data is None :
141
134
return None
142
135
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 )
145
138
146
139
return lines
0 commit comments