This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch rest-pet in repository https://gitbox.apache.org/repos/asf/camel.git
commit 2356c0248b13f259e31f88ad4dc5a9be256ac6cd Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Sun Mar 31 10:32:02 2024 +0200 CAMEL-20637: camel-rest-dsl - Matching rest operation may not select correct --- .../support/RestConsumerContextPathMatcher.java | 10 ++++ .../RestConsumerContextPathMatcherTest.java | 58 ++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/core/camel-support/src/main/java/org/apache/camel/support/RestConsumerContextPathMatcher.java b/core/camel-support/src/main/java/org/apache/camel/support/RestConsumerContextPathMatcher.java index a5d32037997..ba534ae8a44 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/RestConsumerContextPathMatcher.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/RestConsumerContextPathMatcher.java @@ -171,6 +171,16 @@ public final class RestConsumerContextPathMatcher { .sorted(Comparator.comparingInt(o -> -1 * o.getConsumerPath().length())).findFirst().orElse(null); } + // is there a direct match by with a different VERB, as then this call is not allowed + if (answer == null) { + for (ConsumerPath<T> entry : consumerPaths) { + if (matchRestPath(requestPath, entry.getConsumerPath(), false)) { + // okay we have direct match but for another VERB so this call is not allowed + return null; + } + } + } + if (answer != null) { return answer; } diff --git a/core/camel-support/src/test/java/org/apache/camel/support/RestConsumerContextPathMatcherTest.java b/core/camel-support/src/test/java/org/apache/camel/support/RestConsumerContextPathMatcherTest.java index d079e03b701..067905951ab 100644 --- a/core/camel-support/src/test/java/org/apache/camel/support/RestConsumerContextPathMatcherTest.java +++ b/core/camel-support/src/test/java/org/apache/camel/support/RestConsumerContextPathMatcherTest.java @@ -22,6 +22,7 @@ import java.util.List; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; public class RestConsumerContextPathMatcherTest { @@ -125,4 +126,61 @@ public class RestConsumerContextPathMatcherTest { assertEquals(path2.getConsumerPath(), "/camel/foo/{id}"); assertEquals(path3.getConsumerPath(), "/camel/*"); } + + @Test + public void testRestConsumerContextPathMatcherPetStore() { + List<RestConsumerContextPathMatcher.ConsumerPath<MockConsumerPath>> consumerPaths = new ArrayList<>(); + consumerPaths.add(new MockConsumerPath("POST", "/pet")); + consumerPaths.add(new MockConsumerPath("PUT", "/pet")); + consumerPaths.add(new MockConsumerPath("GET", "/pet/findByStatus")); + consumerPaths.add(new MockConsumerPath("GET", "/pet/findByTags")); + consumerPaths.add(new MockConsumerPath("DELETE", "/pet/{petId}")); + consumerPaths.add(new MockConsumerPath("GET", "/pet/{petId}")); + consumerPaths.add(new MockConsumerPath("POST", "/pet/{petId}")); + consumerPaths.add(new MockConsumerPath("POST", "/pet/{petId}/uploadImage")); + + RestConsumerContextPathMatcher.register("/api/v3/*"); + + RestConsumerContextPathMatcher.ConsumerPath<?> path1 = RestConsumerContextPathMatcher.matchBestPath("GET", + "/pet", consumerPaths); + assertNull(path1); + RestConsumerContextPathMatcher.ConsumerPath<?> path2 = RestConsumerContextPathMatcher.matchBestPath("POST", + "/pet", consumerPaths); + assertEquals(path2.getConsumerPath(), "/pet"); + + RestConsumerContextPathMatcher.ConsumerPath<?> path3 = RestConsumerContextPathMatcher.matchBestPath("GET", + "/pet/findByStatus", consumerPaths); + assertEquals(path3.getConsumerPath(), "/pet/findByStatus"); + RestConsumerContextPathMatcher.ConsumerPath<?> path4 = RestConsumerContextPathMatcher.matchBestPath("DELETE", + "/pet/findByStatus", consumerPaths); + assertNull(path4); + + RestConsumerContextPathMatcher.ConsumerPath<?> path5 = RestConsumerContextPathMatcher.matchBestPath("GET", + "/pet/findByTags", consumerPaths); + assertEquals(path5.getConsumerPath(), "/pet/findByTags"); + RestConsumerContextPathMatcher.ConsumerPath<?> path6 = RestConsumerContextPathMatcher.matchBestPath("POST", + "/pet/findByStatus", consumerPaths); + assertNull(path6); + + RestConsumerContextPathMatcher.ConsumerPath<?> path7 = RestConsumerContextPathMatcher.matchBestPath("GET", + "/pet/123", consumerPaths); + assertEquals(path7.getConsumerPath(), "/pet/{petId}"); + RestConsumerContextPathMatcher.ConsumerPath<?> path8 = RestConsumerContextPathMatcher.matchBestPath("POST", + "/pet/222", consumerPaths); + assertEquals(path8.getConsumerPath(), "/pet/{petId}"); + RestConsumerContextPathMatcher.ConsumerPath<?> path9 = RestConsumerContextPathMatcher.matchBestPath("DELETE", + "/pet/333", consumerPaths); + assertEquals(path9.getConsumerPath(), "/pet/{petId}"); + RestConsumerContextPathMatcher.ConsumerPath<?> path10 = RestConsumerContextPathMatcher.matchBestPath("PUT", + "/pet/444", consumerPaths); + assertNull(path10); + + RestConsumerContextPathMatcher.ConsumerPath<?> path11 = RestConsumerContextPathMatcher.matchBestPath("POST", + "/pet/123/uploadImage", consumerPaths); + assertEquals(path11.getConsumerPath(), "/pet/{petId}/uploadImage"); + RestConsumerContextPathMatcher.ConsumerPath<?> path12 = RestConsumerContextPathMatcher.matchBestPath("DELETE", + "/pet/222/uploadImage", consumerPaths); + assertNull(path12); + } + }