├── .github ├── dependabot.yml └── workflows │ ├── docs.yml │ ├── main.yml │ └── publish.yml ├── .gitignore ├── CHANGELOG.md ├── LICENSE.txt ├── README.md ├── SECURITY.md ├── docs ├── CNAME ├── api.md ├── changelog.md └── index.md ├── fuzz ├── README.md ├── corpus │ ├── fuzz_decoders │ │ └── fuzz_decoders │ ├── fuzz_form │ │ └── fuzz_form │ └── fuzz_options_header │ │ └── fuzz_options_header ├── fuzz_decoders.py ├── fuzz_form.py ├── fuzz_options_header.py └── helpers.py ├── mkdocs.yml ├── multipart ├── __init__.py ├── decoders.py ├── exceptions.py └── multipart.py ├── noxfile.py ├── pyproject.toml ├── python_multipart ├── __init__.py ├── decoders.py ├── exceptions.py ├── multipart.py └── py.typed ├── scripts ├── README.md ├── check ├── lint ├── rename ├── setup └── test ├── tests ├── __init__.py ├── compat.py ├── test_data │ └── http │ │ ├── CRLF_in_header.http │ │ ├── CRLF_in_header.yaml │ │ ├── CR_in_header.http │ │ ├── CR_in_header.yaml │ │ ├── CR_in_header_value.http │ │ ├── CR_in_header_value.yaml │ │ ├── almost_match_boundary.http │ │ ├── almost_match_boundary.yaml │ │ ├── almost_match_boundary_without_CR.http │ │ ├── almost_match_boundary_without_CR.yaml │ │ ├── almost_match_boundary_without_LF.http │ │ ├── almost_match_boundary_without_LF.yaml │ │ ├── almost_match_boundary_without_final_hyphen.http │ │ ├── almost_match_boundary_without_final_hyphen.yaml │ │ ├── bad_end_of_headers.http │ │ ├── bad_end_of_headers.yaml │ │ ├── bad_header_char.http │ │ ├── bad_header_char.yaml │ │ ├── bad_initial_boundary.http │ │ ├── bad_initial_boundary.yaml │ │ ├── base64_encoding.http │ │ ├── base64_encoding.yaml │ │ ├── empty_header.http │ │ ├── empty_header.yaml │ │ ├── empty_message.http │ │ ├── empty_message.yaml │ │ ├── empty_message_with_bad_end.http │ │ ├── empty_message_with_bad_end.yaml │ │ ├── header_with_number.http │ │ ├── header_with_number.yaml │ │ ├── mixed_plain_and_base64_encoding.http │ │ ├── mixed_plain_and_base64_encoding.yaml │ │ ├── multiple_fields.http │ │ ├── multiple_fields.yaml │ │ ├── multiple_files.http │ │ ├── multiple_files.yaml │ │ ├── quoted_printable_encoding.http │ │ ├── quoted_printable_encoding.yaml │ │ ├── single_field.http │ │ ├── single_field.yaml │ │ ├── single_field_blocks.http │ │ ├── single_field_blocks.yaml │ │ ├── single_field_longer.http │ │ ├── single_field_longer.yaml │ │ ├── single_field_single_file.http │ │ ├── single_field_single_file.yaml │ │ ├── single_field_with_leading_newlines.http │ │ ├── single_field_with_leading_newlines.yaml │ │ ├── single_file.http │ │ ├── single_file.yaml │ │ ├── utf8_filename.http │ │ └── utf8_filename.yaml └── test_multipart.py └── uv.lock /.github/dependabot.yml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/.github/dependabot.yml -------------------------------------------------------------------------------- /.github/workflows/docs.yml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/.github/workflows/docs.yml -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/.github/workflows/main.yml -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/.github/workflows/publish.yml -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/.gitignore -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/CHANGELOG.md -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/LICENSE.txt -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/README.md -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/SECURITY.md -------------------------------------------------------------------------------- /docs/CNAME: -------------------------------------------------------------------------------- 1 | multipart.fastapiexpert.com 2 | -------------------------------------------------------------------------------- /docs/api.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/docs/api.md -------------------------------------------------------------------------------- /docs/changelog.md: -------------------------------------------------------------------------------- 1 | --8<-- "CHANGELOG.md" 2 | -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/docs/index.md -------------------------------------------------------------------------------- /fuzz/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/fuzz/README.md -------------------------------------------------------------------------------- /fuzz/corpus/fuzz_decoders/fuzz_decoders: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fuzz/corpus/fuzz_form/fuzz_form: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fuzz/corpus/fuzz_options_header/fuzz_options_header: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fuzz/fuzz_decoders.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/fuzz/fuzz_decoders.py -------------------------------------------------------------------------------- /fuzz/fuzz_form.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/fuzz/fuzz_form.py -------------------------------------------------------------------------------- /fuzz/fuzz_options_header.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/fuzz/fuzz_options_header.py -------------------------------------------------------------------------------- /fuzz/helpers.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/fuzz/helpers.py -------------------------------------------------------------------------------- /mkdocs.yml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/mkdocs.yml -------------------------------------------------------------------------------- /multipart/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/multipart/__init__.py -------------------------------------------------------------------------------- /multipart/decoders.py: -------------------------------------------------------------------------------- 1 | from python_multipart.decoders import * 2 | -------------------------------------------------------------------------------- /multipart/exceptions.py: -------------------------------------------------------------------------------- 1 | from python_multipart.exceptions import * 2 | -------------------------------------------------------------------------------- /multipart/multipart.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/multipart/multipart.py -------------------------------------------------------------------------------- /noxfile.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/noxfile.py -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/pyproject.toml -------------------------------------------------------------------------------- /python_multipart/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/python_multipart/__init__.py -------------------------------------------------------------------------------- /python_multipart/decoders.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/python_multipart/decoders.py -------------------------------------------------------------------------------- /python_multipart/exceptions.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/python_multipart/exceptions.py -------------------------------------------------------------------------------- /python_multipart/multipart.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/python_multipart/multipart.py -------------------------------------------------------------------------------- /python_multipart/py.typed: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scripts/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/scripts/README.md -------------------------------------------------------------------------------- /scripts/check: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/scripts/check -------------------------------------------------------------------------------- /scripts/lint: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/scripts/lint -------------------------------------------------------------------------------- /scripts/rename: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/scripts/rename -------------------------------------------------------------------------------- /scripts/setup: -------------------------------------------------------------------------------- 1 | #!/bin/sh -ex 2 | 3 | uv sync --frozen 4 | -------------------------------------------------------------------------------- /scripts/test: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/scripts/test -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/compat.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/compat.py -------------------------------------------------------------------------------- /tests/test_data/http/CRLF_in_header.http: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/CRLF_in_header.http -------------------------------------------------------------------------------- /tests/test_data/http/CRLF_in_header.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/CRLF_in_header.yaml -------------------------------------------------------------------------------- /tests/test_data/http/CR_in_header.http: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/CR_in_header.http -------------------------------------------------------------------------------- /tests/test_data/http/CR_in_header.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/CR_in_header.yaml -------------------------------------------------------------------------------- /tests/test_data/http/CR_in_header_value.http: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/CR_in_header_value.http -------------------------------------------------------------------------------- /tests/test_data/http/CR_in_header_value.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/CR_in_header_value.yaml -------------------------------------------------------------------------------- /tests/test_data/http/almost_match_boundary.http: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/almost_match_boundary.http -------------------------------------------------------------------------------- /tests/test_data/http/almost_match_boundary.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/almost_match_boundary.yaml -------------------------------------------------------------------------------- /tests/test_data/http/almost_match_boundary_without_CR.http: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/almost_match_boundary_without_CR.http -------------------------------------------------------------------------------- /tests/test_data/http/almost_match_boundary_without_CR.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/almost_match_boundary_without_CR.yaml -------------------------------------------------------------------------------- /tests/test_data/http/almost_match_boundary_without_LF.http: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/almost_match_boundary_without_LF.http -------------------------------------------------------------------------------- /tests/test_data/http/almost_match_boundary_without_LF.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/almost_match_boundary_without_LF.yaml -------------------------------------------------------------------------------- /tests/test_data/http/almost_match_boundary_without_final_hyphen.http: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/almost_match_boundary_without_final_hyphen.http -------------------------------------------------------------------------------- /tests/test_data/http/almost_match_boundary_without_final_hyphen.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/almost_match_boundary_without_final_hyphen.yaml -------------------------------------------------------------------------------- /tests/test_data/http/bad_end_of_headers.http: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/bad_end_of_headers.http -------------------------------------------------------------------------------- /tests/test_data/http/bad_end_of_headers.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/bad_end_of_headers.yaml -------------------------------------------------------------------------------- /tests/test_data/http/bad_header_char.http: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/bad_header_char.http -------------------------------------------------------------------------------- /tests/test_data/http/bad_header_char.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/bad_header_char.yaml -------------------------------------------------------------------------------- /tests/test_data/http/bad_initial_boundary.http: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/bad_initial_boundary.http -------------------------------------------------------------------------------- /tests/test_data/http/bad_initial_boundary.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/bad_initial_boundary.yaml -------------------------------------------------------------------------------- /tests/test_data/http/base64_encoding.http: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/base64_encoding.http -------------------------------------------------------------------------------- /tests/test_data/http/base64_encoding.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/base64_encoding.yaml -------------------------------------------------------------------------------- /tests/test_data/http/empty_header.http: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/empty_header.http -------------------------------------------------------------------------------- /tests/test_data/http/empty_header.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/empty_header.yaml -------------------------------------------------------------------------------- /tests/test_data/http/empty_message.http: -------------------------------------------------------------------------------- 1 | ----boundary-- 2 | -------------------------------------------------------------------------------- /tests/test_data/http/empty_message.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/empty_message.yaml -------------------------------------------------------------------------------- /tests/test_data/http/empty_message_with_bad_end.http: -------------------------------------------------------------------------------- 1 | ----boundary-X 2 | -------------------------------------------------------------------------------- /tests/test_data/http/empty_message_with_bad_end.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/empty_message_with_bad_end.yaml -------------------------------------------------------------------------------- /tests/test_data/http/header_with_number.http: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/header_with_number.http -------------------------------------------------------------------------------- /tests/test_data/http/header_with_number.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/header_with_number.yaml -------------------------------------------------------------------------------- /tests/test_data/http/mixed_plain_and_base64_encoding.http: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/mixed_plain_and_base64_encoding.http -------------------------------------------------------------------------------- /tests/test_data/http/mixed_plain_and_base64_encoding.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/mixed_plain_and_base64_encoding.yaml -------------------------------------------------------------------------------- /tests/test_data/http/multiple_fields.http: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/multiple_fields.http -------------------------------------------------------------------------------- /tests/test_data/http/multiple_fields.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/multiple_fields.yaml -------------------------------------------------------------------------------- /tests/test_data/http/multiple_files.http: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/multiple_files.http -------------------------------------------------------------------------------- /tests/test_data/http/multiple_files.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/multiple_files.yaml -------------------------------------------------------------------------------- /tests/test_data/http/quoted_printable_encoding.http: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/quoted_printable_encoding.http -------------------------------------------------------------------------------- /tests/test_data/http/quoted_printable_encoding.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/quoted_printable_encoding.yaml -------------------------------------------------------------------------------- /tests/test_data/http/single_field.http: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/single_field.http -------------------------------------------------------------------------------- /tests/test_data/http/single_field.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/single_field.yaml -------------------------------------------------------------------------------- /tests/test_data/http/single_field_blocks.http: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/single_field_blocks.http -------------------------------------------------------------------------------- /tests/test_data/http/single_field_blocks.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/single_field_blocks.yaml -------------------------------------------------------------------------------- /tests/test_data/http/single_field_longer.http: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/single_field_longer.http -------------------------------------------------------------------------------- /tests/test_data/http/single_field_longer.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/single_field_longer.yaml -------------------------------------------------------------------------------- /tests/test_data/http/single_field_single_file.http: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/single_field_single_file.http -------------------------------------------------------------------------------- /tests/test_data/http/single_field_single_file.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/single_field_single_file.yaml -------------------------------------------------------------------------------- /tests/test_data/http/single_field_with_leading_newlines.http: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/single_field_with_leading_newlines.http -------------------------------------------------------------------------------- /tests/test_data/http/single_field_with_leading_newlines.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/single_field_with_leading_newlines.yaml -------------------------------------------------------------------------------- /tests/test_data/http/single_file.http: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/single_file.http -------------------------------------------------------------------------------- /tests/test_data/http/single_file.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/single_file.yaml -------------------------------------------------------------------------------- /tests/test_data/http/utf8_filename.http: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/utf8_filename.http -------------------------------------------------------------------------------- /tests/test_data/http/utf8_filename.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_data/http/utf8_filename.yaml -------------------------------------------------------------------------------- /tests/test_multipart.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/tests/test_multipart.py -------------------------------------------------------------------------------- /uv.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kludex/python-multipart/HEAD/uv.lock --------------------------------------------------------------------------------