1
1
# cython: language_level=3
2
2
3
3
from __future__ import print_function
4
+ from typing import Optional
5
+
4
6
from cpython.mem cimport PyMem_Malloc, PyMem_Free
5
7
from cpython cimport PyObject_GetBuffer, PyBuffer_Release, PyBUF_SIMPLE, \
6
8
Py_buffer, PyBytes_AsString
@@ -144,6 +146,51 @@ cdef class HttpParser:
144
146
145
147
# ## Public API ###
146
148
149
+ def set_dangerous_leniencies (
150
+ self ,
151
+ lenient_headers: Optional[bool] = None ,
152
+ lenient_chunked_length: Optional[bool] = None ,
153
+ lenient_keep_alive: Optional[bool] = None ,
154
+ lenient_transfer_encoding: Optional[bool] = None ,
155
+ lenient_version: Optional[bool] = None ,
156
+ lenient_data_after_close: Optional[bool] = None ,
157
+ lenient_optional_lf_after_cr: Optional[bool] = None ,
158
+ lenient_optional_cr_before_lf: Optional[bool] = None ,
159
+ lenient_optional_crlf_after_chunk: Optional[bool] = None ,
160
+ lenient_spaces_after_chunk_size: Optional[bool] = None ,
161
+ ):
162
+ cdef cparser.llhttp_t* parser = self ._cparser
163
+ if lenient_headers is not None :
164
+ cparser.llhttp_set_lenient_headers(
165
+ parser, lenient_headers)
166
+ if lenient_chunked_length is not None :
167
+ cparser.llhttp_set_lenient_chunked_length(
168
+ parser, lenient_chunked_length)
169
+ if lenient_keep_alive is not None :
170
+ cparser.llhttp_set_lenient_keep_alive(
171
+ parser, lenient_keep_alive)
172
+ if lenient_transfer_encoding is not None :
173
+ cparser.llhttp_set_lenient_transfer_encoding(
174
+ parser, lenient_transfer_encoding)
175
+ if lenient_version is not None :
176
+ cparser.llhttp_set_lenient_version(
177
+ parser, lenient_version)
178
+ if lenient_data_after_close is not None :
179
+ cparser.llhttp_set_lenient_data_after_close(
180
+ parser, lenient_data_after_close)
181
+ if lenient_optional_lf_after_cr is not None :
182
+ cparser.llhttp_set_lenient_optional_lf_after_cr(
183
+ parser, lenient_optional_lf_after_cr)
184
+ if lenient_optional_cr_before_lf is not None :
185
+ cparser.llhttp_set_lenient_optional_cr_before_lf(
186
+ parser, lenient_optional_cr_before_lf)
187
+ if lenient_optional_crlf_after_chunk is not None :
188
+ cparser.llhttp_set_lenient_optional_crlf_after_chunk(
189
+ parser, lenient_optional_crlf_after_chunk)
190
+ if lenient_spaces_after_chunk_size is not None :
191
+ cparser.llhttp_set_lenient_spaces_after_chunk_size(
192
+ parser, lenient_spaces_after_chunk_size)
193
+
147
194
def get_http_version (self ):
148
195
cdef cparser.llhttp_t* parser = self ._cparser
149
196
return ' {}.{}' .format(parser.http_major, parser.http_minor)
@@ -161,7 +208,7 @@ cdef class HttpParser:
161
208
cparser.llhttp_errno_t err
162
209
Py_buffer * buf
163
210
bint owning_buf = False
164
- char * err_pos
211
+ const char * err_pos
165
212
166
213
if PyMemoryView_Check(data):
167
214
buf = PyMemoryView_GET_BUFFER(data)
0 commit comments