- Skip preamble before the first multipart boundary more efficiently #262.
- Silently discard epilogue data after the closing multipart boundary #259.
- Add MIME content type info to
File#143. - Handle CTE values case-insensitively #258.
- Remove custom
FormParserclasses #257. - Add
UPLOAD_DELETE_TMPtoFormParserconfig #254. - Emit
field_endfor trailing bare field names on finalize #230. - Handle multipart headers case-insensitively #252.
- Apply Apache-2.0 properly #247.
- Validate
chunk_sizeinparse_form()#244.
- Remove unused
trust_x_headersparameter andX-File-Namefallback #196. - Return processed length from
QuerystringParser._internal_write#229. - Cleanup metadata dunders from
__init__.py#227.
- Drop directory path from filename in
File9433f4b.
- Add support for Python 3.14 and drop EOL 3.8 and 3.9 #216.
- Handle messages containing only end boundary #142.
- Don't warn when CRLF is found after last boundary on
MultipartParser#193.
- Hard break if found data after last boundary on
MultipartParser#189.
- Handle PermissionError in fallback code for old import name #182.
- Add dunder attributes to
multipartpackage #177.
- Fix import scheme for
multipartmodule (#168).
- Rename import to
python_multipart#166.
- Improve error message when boundary character does not match #124.
- Add mypy strict typing #140.
- Enforce 100% coverage #159.
- Improve performance, especially in data with many CR-LF #137.
- Handle invalid CRLF in header name #141.
- Support
on_header_begin#103. - Improve type hints on
FormParser#104. - Fix
OnFileCallbacktype #106. - Improve type hints #110.
- Improve type hints on
File#111. - Add type hint to helper functions #112.
- Minor fix for Field.repr #114.
- Fix use of chunk_size parameter #136.
- Allow digits and valid token chars in headers #134.
- Fix headers being carried between parts #135.
- Add support for Python 3.12 #85.
- Drop support for Python 3.7 #95.
- Add
MultipartState(IntEnum)#96. - Add
QuerystringState#97. - Add
TypedDictcallbacks #98. - Add config
TypedDicts #99.
- Check if Message.get_params return 3-tuple instead of str on parse_options_header #79.
- Cleanup unused regex patterns #82.
- Refactor header option parser to use the standard library instead of a custom RegEx #75.