feat(event_handler): add File parameter support for multipart/form-data uploads in OpenAPI utility#7132
Conversation
…ploads - Add public File parameter class extending _File - Support multipart/form-data parsing with WebKit boundary compatibility - OpenAPI schema generation with format: binary for file uploads - Enhanced dependant logic to handle File + Form parameter combinations - Clean implementation based on upstream develop branch Changes: - params.py: Add File(_File) public class with proper documentation - dependant.py: Add File parameter support in body field info logic - openapi_validation.py: Add multipart parsing with boundary detection - test_file_form_validation.py: Basic test coverage for File parameters This provides customers with File parameter support using the same pattern as Query, Path, Header parameters with Annotated types.
- Add File parameter class in openapi/params.py with binary format schema - Implement comprehensive multipart/form-data parsing in openapi_validation.py * Support for WebKit and standard boundary formats * Base64-encoded request handling for AWS Lambda * Mixed file and form data parsing - Update dependant.py to handle File parameters in body field resolution - Add comprehensive test suite (13 tests) covering: * Basic file upload parsing and validation * WebKit boundary format support * Base64-encoded multipart data * Multiple file uploads * File size constraints validation * Optional file parameters * Error handling for invalid boundaries and missing files - Add file_parameter_example.py demonstrating various File parameter use cases - Clean up unnecessary imports and pragma comments Resolves file upload functionality with full OpenAPI schema generation and validation support.
- Break down _parse_multipart_data method into smaller helper methods - Reduce cognitive complexity from 43 to under 15 per SonarCloud requirement - Improve code readability and maintainability - All existing tests continue to pass Helper methods created: - _decode_request_body: Handle base64 decoding - _extract_boundary_bytes: Extract multipart boundary - _parse_multipart_sections: Parse sections into data dict - _parse_multipart_section: Handle individual section parsing - _split_section_headers_and_content: Split headers/content - _decode_form_field_content: Decode form field as string Addresses SonarCloud cognitive complexity violation while maintaining all existing functionality for File parameter multipart parsing.
- Add missing __future__ annotations imports - Remove unused pytest imports from test files - Remove unused json import from example - Fix line length violations in test files - All File parameter tests continue to pass (13/13) Addresses ruff linting violations: - FA102: Missing future annotations for PEP 604 unions - F401: Unused imports - E501: Line too long violations
- Replace bytes | None with Union[bytes, None] for broader compatibility - Replace str | None with Union[str, None] in examples - Add noqa: UP007 comments to suppress linter preference for newer syntax - Ensures compatibility with Python environments that don't support PEP 604 unions - Fixes test failure: 'Unable to evaluate type annotation bytes | None' All File parameter tests continue to pass (13/13) across Python versions.
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## develop #7132 +/- ##
=========================================
Coverage 96.52% 96.53%
=========================================
Files 275 275
Lines 13117 13377 +260
Branches 986 1036 +50
=========================================
+ Hits 12661 12913 +252
- Misses 353 356 +3
- Partials 103 108 +5 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
@leandrodamascena fixing some failing test and should be ready for a review and feed back |
|
Hi @oyiz-michael, a quick tip: run |
- Added UploadFile-to-bytes conversion in _normalize_field_value() - Handles type annotations including Annotated[bytes, File()] - Fixes 24 failing tests in test_file_parameter.py - All tests now return 200 OK instead of 422 validation errors Resolves multipart form data parsing issue where UploadFile instances weren't being converted to bytes before Pydantic validation.
…to feature/file-parameter-clean
…to ensure_upload_file_schema_references; tidy openapi package
- Created dedicated _convert_uploadfile_to_bytes() function for type conversion - Removed conversion logic from _normalize_field_value() to preserve its original intent - Updated both call sites to chain normalize → convert → validate - Added explanatory comment for __all__ in params.py to document public API intent Addresses reviewer feedback about separation of concerns between normalization (structural changes) and conversion (type transformations/IO operations).
The test was calling _normalize_field_value expecting UploadFile→bytes conversion, but we moved that logic to _convert_uploadfile_to_bytes as part of the separation of concerns refactoring.
The openapi directory needs an __init__.py to be recognized as a Python package by the documentation build system (mkdocstrings). Added a descriptive docstring to document the module's purpose without exporting any symbols.
|
Would it make sense to rely on |
|
|
Not all issues are linked correctly. Please link each issue to the PR either manually or using a closing keyword in the format If mentioning more than one issue, separate them with commas: i.e. |
|
I'm reviewing this PR this week. |
Hi @leandrodamascena let me know if you require any further changes for this Pr and let me know what the plan is for this Pr. thanks |
dreamorosi
left a comment
There was a problem hiding this comment.
Hi @oyiz-michael, apologies for the long delay in reviewing and getting this merged.
The team is quite busy with http://reinvent.awsevents.com prep and because of this we're slightly reprioritizing non-critical PRs.
We'll do our best to review this as soon as possible, but most likely we won't be able to provide a full review before the second week of December, which is after the event.
Thank you for your patience and understanding.
|
Hi @dreamorosi, @leandrodamascena - hope re:Invent went well! Following up on this PR now Thanks for your patience, and let me know what you'd like me to do next! |
|
Hi @leandrodamascena any feedback on this PR? |




Issue number: #7124
closes #7124
Summary
This PR adds comprehensive File parameter support for handling file uploads in multipart/form-data requests within the AWS Lambda Powertools Python Event Handler with OpenAPI validation.
Changes
Added
Fileclass inaws_lambda_powertools/event_handler/openapi/params.pyFormwithformat: binaryin OpenAPI schemaEnhanced multipart parsing in
aws_lambda_powertools/event_handler/middlewares/openapi_validation.py_parse_multipart_datamethod for parsing multipart/form-dataComprehensive test suite with 13 test scenarios covering:
Complete usage example in
examples/event_handler_rest/src/file_parameter_example.pyUser experience
Before: Users could not handle file uploads in multipart/form-data requests with OpenAPI validation. They had to manually parse request bodies or disable validation entirely.
After: Users can now use type-annotated
Fileparameters that automatically:format: binaryChecklist
If your change doesn't seem to apply, please leave them unchecked.
Is this a breaking change?
RFC issue number: N/AThis is not a breaking change - it's a new feature addition that doesn't modify existing functionality.
Checklist:
Acknowledgment
By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.