Skip to content

feat(event_handler): add support for form data in OpenAPI utility #7028

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Conversation

oyiz-michael
Copy link
Contributor

@oyiz-michael oyiz-michael commented Jul 23, 2025

Issue number: #7024

Summary

Problem Statement: OpenAPI spec generation didn't support File/Form parameters

Solution: Adds minimal, uniform support for file uploads and form fields in OpenAPI generation.

  • File params → multipart/form-data requestBody with format: binary
  • Form params → application/x-www-form-urlencoded requestBody
  • Follows existing validation patterns; headers untouched.

Changes

  • Update dependant.py to infer media types from File/Form params
  • Enhanced [_File] class to add format: binary
    -Updated get_body_field_info to set correct media types
  • Extend _File in params.py to auto-add format: binary
  • Add public re-exports: File = _File, Form = _Form
  • Added documentation with examples
Screen Shot 2025-07-23 at 23 10 57 PM Screen Shot 2025-07-23 at 23 08 33 PM

User experience

Before

@app.post("/upload")
def upload(file: Annotated[str, File()]):
  ...
# OpenAPI generated no requestBody (file ignored)

**After**
```python
@app.post("/upload")
def upload(file: Annotated[str, File()]):
    ...
# Generates multipart/form-data requestBody with format: binary
requestBody:
  content:
    multipart/form-data:
      schema:
        type: object
        properties:
          file:
            type: string
            format: binary

Checklist

If your change doesn't seem to apply, please leave them unchecked.

Is this a breaking change? No — fully backward-compatible.

RFC issue number: N/A

Checklist:

  • Migration process documented
  • Implement warnings (if it can live side by side)

Acknowledgment

By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.

Disclaimer: We value your time and bandwidth. As such, any pull requests created on non-triaged issues might not be successful.

@oyiz-michael oyiz-michael requested a review from a team as a code owner July 23, 2025 22:26
@oyiz-michael oyiz-michael requested a review from anafalcao July 23, 2025 22:26
@pull-request-size pull-request-size bot added the size/M Denotes a PR that changes 30-99 lines, ignoring generated files. label Jul 23, 2025
@boring-cyborg boring-cyborg bot added documentation Improvements or additions to documentation event_handlers labels Jul 23, 2025
Copy link

boring-cyborg bot commented Jul 23, 2025

Thanks a lot for your first contribution! Please check out our contributing guidelines and don't hesitate to ask whatever you need.
In the meantime, check out the #python channel on our Powertools for AWS Lambda Discord: Invite link

@leandrodamascena leandrodamascena changed the title feat(openapi): add multipart/form-data & x-www-form-urlencoded support feat(event_handler): add multipart/form-data & x-www-form-urlencoded support in OpenAPI utility Jul 24, 2025
@leandrodamascena leandrodamascena linked an issue Jul 24, 2025 that may be closed by this pull request
2 tasks
@github-actions github-actions bot added feature New feature or functionality and removed documentation Improvements or additions to documentation labels Jul 24, 2025
Copy link
Contributor

@leandrodamascena leandrodamascena left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @oyiz-michael thanks a lot for working on this PR! Can you please run make format and push a new commit? Ruff is complaining about some unformatted files.

@boring-cyborg boring-cyborg bot added the documentation Improvements or additions to documentation label Jul 24, 2025
@github-actions github-actions bot removed the documentation Improvements or additions to documentation label Jul 24, 2025
@oyiz-michael
Copy link
Contributor Author

@leandrodamascena Done! Just pushed the formatting fixes. 👍

@leandrodamascena leandrodamascena self-requested a review July 24, 2025 08:55
Copy link

codecov bot commented Jul 24, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 96.27%. Comparing base (7afb585) to head (6487a6a).
⚠️ Report is 2 commits behind head on develop.

Additional details and impacted files
@@             Coverage Diff             @@
##           develop    #7028      +/-   ##
===========================================
+ Coverage    96.24%   96.27%   +0.02%     
===========================================
  Files          275      275              
  Lines        12896    12912      +16     
  Branches       952      954       +2     
===========================================
+ Hits         12412    12431      +19     
+ Misses         378      376       -2     
+ Partials       106      105       -1     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Copy link
Contributor

@leandrodamascena leandrodamascena left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @oyiz-michael, thank you so much for resolving the issue with Ruff.

I'll start reviewing this code, but so far I've suggested two changes. Could you add tests for the File and Form types? I didn't see any tests, and it's good to have tests to ensure it's working as expected and that we can catch any errors.

Thank you.

@boring-cyborg boring-cyborg bot added documentation Improvements or additions to documentation tests labels Jul 24, 2025
@pull-request-size pull-request-size bot added size/L Denotes a PR that changes 100-499 lines, ignoring generated files. and removed size/M Denotes a PR that changes 30-99 lines, ignoring generated files. labels Jul 24, 2025
@pull-request-size pull-request-size bot added size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files. and removed size/XL Denotes a PR that changes 500-999 lines, ignoring generated files. labels Jul 24, 2025
@oyiz-michael
Copy link
Contributor Author

I added 22 new comprehensive tests that cover:

Content Type Inference Tests:

Routes with File/Form parameters → multipart inference
Routes with regular body parameters → JSON inference
Routes without body parameters → JSON default
JSON Parsing Tests:

Invalid JSON handling and error responses
Proper error message formatting
Form Data Parsing Tests:

URL-encoded form data with single/multiple values
Empty body handling
Exception path coverage
Multipart Data Parsing Tests:

Missing boundary error handling
Invalid multipart format handling
File uploads with filename detection
Text fields without filename
Different line separator handling (\n vs \r\n)
Helper Method Edge Cases:

Field name extraction (quoted vs unquoted)
Boundary extraction with additional parameters
Malformed headers handling
Content-Disposition parsing edge cases
Error Handling Tests:

Unsupported content types
Missing content-disposition headers
Invalid multipart structure

@oyiz-michael
Copy link
Contributor Author

Successfully Enhanced Test Coverage: The test file now includes comprehensive coverage for all the refactored helper methods in the OpenAPI validation middleware.

All Tests Pass: No test failures, confirming that our new tests are well-written and the underlying code is working correctly.

Coverage Target Exceeded: The overall project coverage of 96.16% significantly exceeds the minimum requirement of 90%.

Robust Testing: The new tests cover various edge cases including:

Content type inference for different scenarios
JSON parsing with invalid data
Form data parsing (URL-encoded and multipart)
File upload handling
Error conditions and exception handling
Response serialization with custom serializers

@leandrodamascena leandrodamascena self-requested a review July 25, 2025 15:40
Copy link
Contributor

@leandrodamascena leandrodamascena left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @oyiz-michael! I really appreciate your patience and effort in making this happen! I've been reviewing the code, tests, and implementation and have some feedback to help make our work easier.

By the way, I love that you're using GenAI to iterate on comments and resolve them; that's fantastic. I use Kiro and Amazon Q extensively in my daily work. However, some tests created with these tools aren't working as expected, and the Form implementation has some critical issues.

So, what I think make sense to merge this PR is:

1/ The implementation of Form is working as expected and tests are good. We can keep it.

2/ The implementation of File has critical bugs and the tests are not covering some critical scenarios. For example, browsers like Safari and some old versions of Chrome can use WebKitFormBoundary instead of boundary to define file elements and the code is not covering that. So, lets revert this to _File and remove all the code for this object, keeping only Form.

Again, thanks a lot for your work and please let me know if you want me to make this refactor and merge this PR.

@oyiz-michael
Copy link
Contributor Author

@leandrodamascena Thank you so much for the detailed review and appreciate your feedback.
I completely agree with your suggested approach: Keep the Form implementation as it's working well and remove the file upload functionality for now.
This makes perfect sense to get a solid foundation with Form support first, and we can always revisit File uploads in a future PR with more comprehensive multipart handling.
I'm okay to let you do the refactor to keep only the Form functionality.

Thanks again for the thorough review and for helping make this feature production-ready

@pull-request-size pull-request-size bot added size/L Denotes a PR that changes 100-499 lines, ignoring generated files. and removed size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files. labels Jul 28, 2025
@github-actions github-actions bot removed the documentation Improvements or additions to documentation label Jul 28, 2025
@boring-cyborg boring-cyborg bot added the documentation Improvements or additions to documentation label Jul 28, 2025
@github-actions github-actions bot removed the documentation Improvements or additions to documentation label Jul 28, 2025
@boring-cyborg boring-cyborg bot added the documentation Improvements or additions to documentation label Jul 28, 2025
Copy link

@github-actions github-actions bot removed the documentation Improvements or additions to documentation label Jul 28, 2025
@leandrodamascena leandrodamascena changed the title feat(event_handler): add multipart/form-data & x-www-form-urlencoded support in OpenAPI utility feat(event_handler): add support for form data in OpenAPI utility Jul 28, 2025
@boring-cyborg boring-cyborg bot added the documentation Improvements or additions to documentation label Jul 28, 2025
@github-actions github-actions bot removed the documentation Improvements or additions to documentation label Jul 28, 2025
@leandrodamascena leandrodamascena self-requested a review July 28, 2025 09:11
Copy link
Contributor

@leandrodamascena leandrodamascena left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @oyiz-michael, I made some changes to remove the File object and everything is ready to be merged!

Thank you so much for working on this, and we'll mention your alias in our release notes when we release a new version.

APPROVED!

@leandrodamascena leandrodamascena merged commit c83d15e into aws-powertools:develop Jul 28, 2025
18 checks passed
Copy link

boring-cyborg bot commented Jul 28, 2025

Awesome work, congrats on your first merged pull request and thank you for helping improve everyone's experience!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
event_handlers feature New feature or functionality size/L Denotes a PR that changes 100-499 lines, ignoring generated files. tests
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Feature request: Support Form object in APIGatewayRestResolver
3 participants