This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new 280bb72047d CAMEL-22116: Fix camel-openapi-validator to better support
base-path such as SB war apps that are seperated by context-path
280bb72047d is described below
commit 280bb72047d4f036ecba24f40941c919d28faa88
Author: Claus Ibsen <[email protected]>
AuthorDate: Tue Jun 3 13:06:59 2025 +0200
CAMEL-22116: Fix camel-openapi-validator to better support base-path such
as SB war apps that are seperated by context-path
---
components/camel-openapi-validator/pom.xml | 2 +-
.../client/OpenApiRestClientRequestValidator.java | 9 ++++++++
.../component/rest/openapi/RestOpenApiHelper.java | 2 +-
.../rest/openapi/RestOpenApiProcessor.java | 25 +++++++++++-----------
4 files changed, 23 insertions(+), 15 deletions(-)
diff --git a/components/camel-openapi-validator/pom.xml
b/components/camel-openapi-validator/pom.xml
index 46226572df8..2d4254e4f12 100644
--- a/components/camel-openapi-validator/pom.xml
+++ b/components/camel-openapi-validator/pom.xml
@@ -40,7 +40,7 @@
<dependency>
<groupId>org.apache.camel</groupId>
- <artifactId>camel-support</artifactId>
+ <artifactId>camel-rest-openapi</artifactId>
</dependency>
<dependency>
diff --git
a/components/camel-openapi-validator/src/main/java/org/apache/camel/component/rest/openapi/validator/client/OpenApiRestClientRequestValidator.java
b/components/camel-openapi-validator/src/main/java/org/apache/camel/component/rest/openapi/validator/client/OpenApiRestClientRequestValidator.java
index 76382cbe283..e0dcb1d4bf8 100644
---
a/components/camel-openapi-validator/src/main/java/org/apache/camel/component/rest/openapi/validator/client/OpenApiRestClientRequestValidator.java
+++
b/components/camel-openapi-validator/src/main/java/org/apache/camel/component/rest/openapi/validator/client/OpenApiRestClientRequestValidator.java
@@ -23,6 +23,7 @@ import
com.atlassian.oai.validator.report.SimpleValidationReportFormat;
import com.atlassian.oai.validator.report.ValidationReport;
import io.swagger.v3.oas.models.OpenAPI;
import org.apache.camel.Exchange;
+import org.apache.camel.component.rest.openapi.RestOpenApiHelper;
import org.apache.camel.spi.RestClientRequestValidator;
import org.apache.camel.spi.annotations.JdkService;
import org.apache.camel.support.ExchangeHelper;
@@ -40,6 +41,13 @@ public class OpenApiRestClientRequestValidator implements
RestClientRequestValid
String method = exchange.getMessage().getHeader(Exchange.HTTP_METHOD,
String.class);
String path = exchange.getMessage().getHeader(Exchange.HTTP_PATH,
String.class);
+
+ // need to clip base-path
+ String basePath = RestOpenApiHelper.getBasePathFromOpenApi(openAPI);
+ if (path != null && path.startsWith(basePath)) {
+ path = path.substring(basePath.length());
+ }
+
String accept = exchange.getMessage().getHeader("Accept",
String.class);
String contentType = ExchangeHelper.getContentType(exchange);
String body = MessageHelper.extractBodyAsString(exchange.getIn());
@@ -56,6 +64,7 @@ public class OpenApiRestClientRequestValidator implements
RestClientRequestValid
}
// Use all non-Camel headers
for (String header : exchange.getMessage().getHeaders().keySet()) {
+ // TODO: should skip standard HTTP headers like: Host, User-Agent
if (!startsWithIgnoreCase(header, "Camel")) {
builder.withHeader(header,
exchange.getMessage().getHeader(header, String.class));
}
diff --git
a/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiHelper.java
b/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiHelper.java
index 088db205b6e..26114dcc3b3 100644
---
a/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiHelper.java
+++
b/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiHelper.java
@@ -34,7 +34,7 @@ import org.apache.camel.util.StringHelper;
import static org.apache.camel.util.StringHelper.notEmpty;
-final class RestOpenApiHelper {
+public final class RestOpenApiHelper {
private static final Pattern HOST_PATTERN =
Pattern.compile("https?://[^:]+(:\\d+)?", Pattern.CASE_INSENSITIVE);
private static final List<String> YAML_CONTENT_TYPES =
Arrays.asList("application/yaml", "application/yml",
diff --git
a/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiProcessor.java
b/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiProcessor.java
index aa67c225306..626372536f7 100644
---
a/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiProcessor.java
+++
b/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiProcessor.java
@@ -33,7 +33,6 @@ import org.apache.camel.support.processor.RestBindingAdvice;
import org.apache.camel.support.processor.RestBindingAdviceFactory;
import org.apache.camel.support.processor.RestBindingConfiguration;
import org.apache.camel.support.service.ServiceHelper;
-import org.apache.camel.util.URISupport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -95,42 +94,42 @@ public class RestOpenApiProcessor extends
DelegateAsyncProcessor implements Came
@Override
public boolean process(Exchange exchange, AsyncCallback callback) {
// use HTTP_URI as this works for all runtimes
- String uri = exchange.getMessage().getHeader(Exchange.HTTP_URI,
String.class);
- if (uri != null) {
- uri = URISupport.stripQuery(uri);
- }
- if (uri != null && uri.startsWith(basePath)) {
- uri = uri.substring(basePath.length());
+ String path = exchange.getMessage().getHeader(Exchange.HTTP_PATH,
String.class);
+ // if (path != null) {
+ // path = URISupport.stripQuery(path);
+ // }
+ if (path != null && path.startsWith(basePath)) {
+ path = path.substring(basePath.length());
}
String verb = exchange.getMessage().getHeader(Exchange.HTTP_METHOD,
String.class);
RestConsumerContextPathMatcher.ConsumerPath<Operation> m
- = RestConsumerContextPathMatcher.matchBestPath(verb, uri,
paths);
+ = RestConsumerContextPathMatcher.matchBestPath(verb, path,
paths);
if (m instanceof RestOpenApiConsumerPath rcp) {
Operation o = rcp.getConsumer();
String consumerPath = rcp.getConsumerPath();
//if uri is not starting with slash then remove the slash in the
consumerPath from the openApi spec
- if (consumerPath.startsWith("/") && uri != null &&
!uri.startsWith("/")) {
+ if (consumerPath.startsWith("/") && path != null &&
!path.startsWith("/")) {
consumerPath = consumerPath.substring(1);
}
// map path-parameters from operation to camel headers
- HttpHelper.evalPlaceholders(exchange.getMessage().getHeaders(),
uri, consumerPath);
+ HttpHelper.evalPlaceholders(exchange.getMessage().getHeaders(),
path, consumerPath);
// process the incoming request
- return restOpenapiProcessorStrategy.process(openAPI, o, verb, uri,
rcp.getBinding(), exchange, callback);
+ return restOpenapiProcessorStrategy.process(openAPI, o, verb,
path, rcp.getBinding(), exchange, callback);
}
// is it the api-context path
- if (uri != null && uri.equals(apiContextPath)) {
+ if (path != null && path.equals(apiContextPath)) {
return
restOpenapiProcessorStrategy.processApiSpecification(endpoint.getSpecificationUri(),
exchange, callback);
}
// okay we cannot process this requires so return either 404 or 405.
// to know if its 405 then we need to check if any other HTTP method
would have a consumer for the "same" request
- final String contextPath = uri;
+ final String contextPath = path;
List<String> allow = METHODS.stream()
.filter(v -> RestConsumerContextPathMatcher.matchBestPath(v,
contextPath, paths) != null).toList();
if (allow.isEmpty()) {