You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2024/03/31 08:32:20 UTC

(camel) branch rest-pet created (now 2356c0248b1)

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a change to branch rest-pet
in repository https://gitbox.apache.org/repos/asf/camel.git


      at 2356c0248b1 CAMEL-20637: camel-rest-dsl - Matching rest operation may not select correct

This branch includes the following new commits:

     new 2356c0248b1 CAMEL-20637: camel-rest-dsl - Matching rest operation may not select correct

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(camel) 01/01: CAMEL-20637: camel-rest-dsl - Matching rest operation may not select correct

Posted by da...@apache.org.
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 <cl...@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);
+    }
+
 }