Skip to content

Conversation

@Robbie-Palmer
Copy link
Contributor

Summary

Path parameters containing reserved characters were being inserted directly into URLs without encoding, causing malformed requests and potential security issues.

Problem

When path parameters contain special characters like:

  • Slashes (/)
  • Question marks (?)
  • Ampersands (&)
  • Hash/fragments (#)
  • Spaces

These were not being URL-encoded, leading to:

  • Malformed URLs that break routing
  • Security vulnerabilities where parameter values could inject path segments
  • Non-compliance with RFC 3986

Solution

  • Import urllib.parse.quote in the endpoint template
  • Wrap all path parameters with quote(str(...), safe="") to ensure proper percent-encoding
  • Add comprehensive tests for various special characters in path parameters

Changes

  • Updated openapi_python_client/templates/endpoint_module.py.jinja to add URL encoding
  • Added end_to_end_tests/functional_tests/generated_code_execution/test_path_parameters.py with tests
  • Regenerated all golden records to reflect the encoding changes

Test plan

  • Added test for normal alphanumeric path parameters (baseline)
  • Added tests for path parameters with reserved characters (/, ?, &, #)
  • Added tests for path parameters with spaces
  • Regenerated golden records with pdm regen
  • Verified generated code properly encodes all special characters

Example

Before:

"url": f"/items/{item_id}/details/{detail_id}"
# With item_id="item/with/slashes" becomes:
# "/items/item/with/slashes/details/..." (broken!)

After:

"url": "/items/{item_id}/details/{detail_id}".format(
    item_id=quote(str(item_id), safe=""),
    detail_id=quote(str(detail_id), safe=""),
)
# With item_id="item/with/slashes" becomes:
# "/items/item%2Fwith%2Fslashes/details/..." (correct!)

@dbanty dbanty added 🐞bug Something isn't working 🥚breaking This change breaks compatibility labels Nov 3, 2025
@dbanty dbanty changed the title fix: Properly URL-encode path parameters in generated endpoints fix!: URL-encode path parameters in generated endpoints Nov 4, 2025
Path parameters containing reserved characters (/, ?, &, #, spaces, etc.)
were being inserted directly into URLs without encoding, causing malformed
requests and potential security issues.

Changes:
- Import urllib.parse.quote in endpoint template
- Wrap all path parameters with quote(str(...), safe="") to ensure proper encoding
- Add comprehensive tests for various special characters in path parameters

This ensures that path parameters are properly percent-encoded according to
RFC 3986, preventing URL parsing errors and security vulnerabilities.

Fixes cases where path parameters contain:
- Slashes (/) -> %2F
- Question marks (?) -> %3F
- Ampersands (&) -> %26
- Hash/fragments (#) -> %23
- Spaces -> %20
- And other reserved characters
Copy link
Collaborator

@dbanty dbanty left a comment

Choose a reason for hiding this comment

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

Seems like the right call, though I will mark as a breaking change since someone was probably relying on the previous unsafe behavior 😓.

Thanks!

@dbanty dbanty enabled auto-merge November 4, 2025 01:04
@dbanty dbanty added this pull request to the merge queue Nov 4, 2025
Merged via the queue into openapi-generators:main with commit 3464f80 Nov 4, 2025
22 checks passed
@knope-bot knope-bot bot mentioned this pull request Nov 4, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🥚breaking This change breaks compatibility 🐞bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants