Federico Mariani created CAMEL-24112:
----------------------------------------
Summary: camel-rest-openapi: path parameters leak into the query
string when the operation has more than one parameter
Key: CAMEL-24112
URL: https://issues.apache.org/jira/browse/CAMEL-24112
Project: Camel
Issue Type: Bug
Components: camel-rest-openapi
Affects Versions: 4.21.0
Reporter: Federico Mariani
h3. Problem
{{RestOpenApiEndpoint.determineEndpointParameters()}}
(RestOpenApiEndpoint.java:672-687) tries to skip endpoint URI parameters that
are operation *path* parameters, so they are not duplicated as query parameters
(CAMEL-17049). The loop is logically inverted: the entry is {{put}} into
{{nestedParameters}} *inside* the inner per-operation-parameter loop whenever
*any* operation parameter is not the clashing path parameter, instead of only
when *no* parameter clashes. The skip therefore only works when the operation
has exactly one parameter. The leaked entries become
{{RestEndpoint.parameters}}, flow into the lenient delegate HTTP endpoint, and
are appended as literal query parameters to the target URI.
h3. Failure scenario
Spec operation {{GET /users/\{userId\}/orders/\{orderId\}}} (two path params,
no query params), route
{{to("rest-openapi:spec.json#getOrder?userId=1&orderId=2")}} with the
camel-http delegate -> request sent is {{GET
/users/1/orders/2?userId=1&orderId=2}}. Verified by execution against current
main; a single-path-param operation is handled correctly. APIs with strict
query validation or signed/canonicalized URLs reject the request. When the
operation also declares query parameters the leak is masked for camel-http by
the {{Exchange.REST_HTTP_QUERY}} override, but not for other delegates.
h3. History
Introduced verbatim by commit 94847d8c4a84 (CAMEL-17049, "avoid duplicate
parameters if the param is a path param"). The intent is unambiguous; the
implementation only works for the 1-parameter case. Not pinned by tests
({{RestOpenApiEndpointV3Test.shouldDetermineEndpointParameters}} never combines
endpoint literals with multi-parameter operations).
h3. Fix direction
Compute the clash with {{operation.getParameters().stream().anyMatch(p ->
"path".equals(p.getIn()) && entry.getKey().equals(p.getName()))}} and {{put}}
once outside the inner loop. This also resolves the current asymmetry where an
*empty* (non-null) parameter list drops all endpoint literals while a {{null}}
list keeps them.
----
_This issue was researched and filed by Claude Code on behalf of [~croway]
(GitHub: Croway), as part of a deep code review of camel-rest-openapi and
camel-openapi-java on main (4.22.0-SNAPSHOT). Full findings document available
on request._
--
This message was sent by Atlassian Jira
(v8.20.10#820010)