You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ja...@apache.org on 2023/07/27 14:57:39 UTC

[camel-quarkus] 01/02: Disallow invalid host/port values on the vertx-websocket server consumer

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

jamesnetherton pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git

commit f2e6f050e0ca72d5ae3c385e935caee64055aa9a
Author: James Netherton <ja...@gmail.com>
AuthorDate: Thu Jul 27 12:34:17 2023 +0100

    Disallow invalid host/port values on the vertx-websocket server consumer
    
    Fixes #5118
---
 .../reference/extensions/vertx-websocket.adoc      | 12 ++++-------
 .../runtime/src/main/doc/usage.adoc                | 12 ++++-------
 .../vertx/websocket/VertxWebsocketRecorder.java    |  7 +++++++
 .../vertx/websocket/it/VertxWebsocketResource.java | 17 +++++++++++++++
 .../vertx/websocket/it/VertxWebsocketRoutes.java   |  4 ----
 .../vertx/websocket/it/VertxWebsocketTest.java     | 24 +++++++++-------------
 6 files changed, 42 insertions(+), 34 deletions(-)

diff --git a/docs/modules/ROOT/pages/reference/extensions/vertx-websocket.adoc b/docs/modules/ROOT/pages/reference/extensions/vertx-websocket.adoc
index 8c396c918a..21529f4984 100644
--- a/docs/modules/ROOT/pages/reference/extensions/vertx-websocket.adoc
+++ b/docs/modules/ROOT/pages/reference/extensions/vertx-websocket.adoc
@@ -63,13 +63,9 @@ from("vertx-websocket:/my-websocket-path")
     .setBody().constant("Hello World");
 ----
 
-Or alternatively, you can refer to the full host & port configuration for the Quarkus HTTP server.
-
-[source,java]
-----
-from("vertx-websocket:{{quarkus.http.host}}:{{quarkus.http.port}}/my-websocket-path")
-    .setBody().constant("Hello World");
-----
+NOTE: While you do not need to explicitly configure the host/port on the vertx-websocket consumer. If you choose to,
+the host & port must exactly match the value of the Quarkus HTTP server configuration values for `quarkus.http.host` and `quarkus.http.port`.
+Otherwise an exception will be thrown at runtime.
 
 [id="extensions-vertx-websocket-usage-vert-x-websocket-producers"]
 === Vert.x WebSocket producers
@@ -93,7 +89,7 @@ from("direct:sendToWebSocket")
     .log("vertx-websocket:{{quarkus.http.host}}:{{quarkus.http.port}}/my-websocket-path");
 ----
 
-When producing messages to an external WebSocket server, then you must provide the host name and port (if required).
+When producing messages to an external WebSocket server, then you must always provide the host name and port (if required).
 
 
 [id="extensions-vertx-websocket-additional-camel-quarkus-configuration"]
diff --git a/extensions/vertx-websocket/runtime/src/main/doc/usage.adoc b/extensions/vertx-websocket/runtime/src/main/doc/usage.adoc
index 902c7225f9..649300042f 100644
--- a/extensions/vertx-websocket/runtime/src/main/doc/usage.adoc
+++ b/extensions/vertx-websocket/runtime/src/main/doc/usage.adoc
@@ -11,13 +11,9 @@ from("vertx-websocket:/my-websocket-path")
     .setBody().constant("Hello World");
 ----
 
-Or alternatively, you can refer to the full host & port configuration for the Quarkus HTTP server.
-
-[source,java]
-----
-from("vertx-websocket:{{quarkus.http.host}}:{{quarkus.http.port}}/my-websocket-path")
-    .setBody().constant("Hello World");
-----
+NOTE: While you do not need to explicitly configure the host/port on the vertx-websocket consumer. If you choose to,
+the host & port must exactly match the value of the Quarkus HTTP server configuration values for `quarkus.http.host` and `quarkus.http.port`.
+Otherwise an exception will be thrown at runtime.
 
 === Vert.x WebSocket producers
 
@@ -40,4 +36,4 @@ from("direct:sendToWebSocket")
     .log("vertx-websocket:{{quarkus.http.host}}:{{quarkus.http.port}}/my-websocket-path");
 ----
 
-When producing messages to an external WebSocket server, then you must provide the host name and port (if required).
+When producing messages to an external WebSocket server, then you must always provide the host name and port (if required).
diff --git a/extensions/vertx-websocket/runtime/src/main/java/org/apache/camel/quarkus/component/vertx/websocket/VertxWebsocketRecorder.java b/extensions/vertx-websocket/runtime/src/main/java/org/apache/camel/quarkus/component/vertx/websocket/VertxWebsocketRecorder.java
index 05e90337a3..9c6c6ed0b2 100644
--- a/extensions/vertx-websocket/runtime/src/main/java/org/apache/camel/quarkus/component/vertx/websocket/VertxWebsocketRecorder.java
+++ b/extensions/vertx-websocket/runtime/src/main/java/org/apache/camel/quarkus/component/vertx/websocket/VertxWebsocketRecorder.java
@@ -85,6 +85,13 @@ public class VertxWebsocketRecorder {
         @Override
         protected VertxWebsocketHost createVertxWebsocketHost(VertxWebsocketHostConfiguration hostConfiguration,
                 VertxWebsocketHostKey hostKey) {
+            // If a host / port was specified on the consumer, it must be the same as what the Quarkus HTTP server is bound to
+            if (!hostKey.getHost().equals(HOST) || hostKey.getPort() != PORT) {
+                String message = String.format(
+                        "Invalid host/port %s:%d. The host/port can only be configured as %s:%d",
+                        hostKey.getHost(), hostKey.getPort(), HOST, PORT);
+                throw new IllegalArgumentException(message);
+            }
             return new QuarkusVertxWebsocketHost(getCamelContext(), hostConfiguration, hostKey);
         }
 
diff --git a/integration-tests/vertx-websocket/src/main/java/org/apache/camel/quarkus/component/vertx/websocket/it/VertxWebsocketResource.java b/integration-tests/vertx-websocket/src/main/java/org/apache/camel/quarkus/component/vertx/websocket/it/VertxWebsocketResource.java
index ac0795f908..5789689ecf 100644
--- a/integration-tests/vertx-websocket/src/main/java/org/apache/camel/quarkus/component/vertx/websocket/it/VertxWebsocketResource.java
+++ b/integration-tests/vertx-websocket/src/main/java/org/apache/camel/quarkus/component/vertx/websocket/it/VertxWebsocketResource.java
@@ -35,6 +35,7 @@ import jakarta.ws.rs.PathParam;
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.QueryParam;
 import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.Response;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ConsumerTemplate;
 import org.apache.camel.ProducerTemplate;
@@ -42,10 +43,12 @@ import org.apache.camel.quarkus.component.vertx.websocket.VertxWebsocketRecorder
 import org.apache.camel.support.jsse.KeyStoreParameters;
 import org.apache.camel.support.jsse.SSLContextParameters;
 import org.apache.camel.support.jsse.TrustManagersParameters;
+import org.jboss.logging.Logger;
 
 @Path("/vertx-websocket")
 @ApplicationScoped
 public class VertxWebsocketResource {
+    private static final Logger LOG = Logger.getLogger(VertxWebsocketResource.class);
 
     @Inject
     CamelContext context;
@@ -121,6 +124,20 @@ public class VertxWebsocketResource {
         return connectOptions.getPort();
     }
 
+    @Path("/invalid/consumer/uri")
+    @GET
+    @Produces(MediaType.TEXT_PLAIN)
+    public Response invalidConsumerHostPort(@QueryParam("hostPort") String hostPort) {
+        try {
+            consumerTemplate.receive("vertx-websocket:" + hostPort + "/test");
+            return Response.ok().build();
+        } catch (Exception e) {
+            LOG.error("Error creating vertx-websocket consumer", e);
+            String message = e.getCause() != null ? e.getCause().getMessage() : e.getMessage();
+            return Response.serverError().entity(message).build();
+        }
+    }
+
     @Named
     public SSLContextParameters clientSSLContextParameters() {
         KeyStoreParameters truststoreParameters = new KeyStoreParameters();
diff --git a/integration-tests/vertx-websocket/src/main/java/org/apache/camel/quarkus/component/vertx/websocket/it/VertxWebsocketRoutes.java b/integration-tests/vertx-websocket/src/main/java/org/apache/camel/quarkus/component/vertx/websocket/it/VertxWebsocketRoutes.java
index 231e23fe76..88a12a5cd7 100644
--- a/integration-tests/vertx-websocket/src/main/java/org/apache/camel/quarkus/component/vertx/websocket/it/VertxWebsocketRoutes.java
+++ b/integration-tests/vertx-websocket/src/main/java/org/apache/camel/quarkus/component/vertx/websocket/it/VertxWebsocketRoutes.java
@@ -36,10 +36,6 @@ public class VertxWebsocketRoutes extends RouteBuilder {
                 .end()
                 .to("vertx-websocket:/");
 
-        from("vertx-websocket:redundant.host:9999/test/default/host/port/applied")
-                .setBody(simple("Hello ${body}"))
-                .to("vertx-websocket:/test/default/host/port/applied");
-
         from("direct:sendMessage")
                 .to("vertx-websocket:/test");
 
diff --git a/integration-tests/vertx-websocket/src/test/java/org/apache/camel/quarkus/component/vertx/websocket/it/VertxWebsocketTest.java b/integration-tests/vertx-websocket/src/test/java/org/apache/camel/quarkus/component/vertx/websocket/it/VertxWebsocketTest.java
index 414cbfbed0..c2a053622d 100644
--- a/integration-tests/vertx-websocket/src/test/java/org/apache/camel/quarkus/component/vertx/websocket/it/VertxWebsocketTest.java
+++ b/integration-tests/vertx-websocket/src/test/java/org/apache/camel/quarkus/component/vertx/websocket/it/VertxWebsocketTest.java
@@ -42,6 +42,7 @@ import org.junit.jupiter.params.provider.MethodSource;
 import org.junit.jupiter.params.provider.ValueSource;
 
 import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.startsWith;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
@@ -54,9 +55,6 @@ class VertxWebsocketTest {
     @TestHTTPResource("/echo")
     URI echo;
 
-    @TestHTTPResource("/test/default/host/port/applied")
-    URI defaultHostPortApplied;
-
     @TestHTTPResource("/client/consumer")
     URI clientConsumer;
 
@@ -82,17 +80,15 @@ class VertxWebsocketTest {
         }
     }
 
-    @Test
-    public void testEchoWithIgnoredHostPortConfig() throws Exception {
-        String message = "From Ignored Host Port Config";
-
-        try (WebSocketConnection connection = new WebSocketConnection(defaultHostPortApplied, message)) {
-            connection.connect();
-
-            List<String> messages = connection.getMessages();
-            assertEquals(1, messages.size());
-            assertEquals("Hello " + message, messages.get(0));
-        }
+    @ParameterizedTest
+    @ValueSource(strings = { "invalid.host", "localhost:9999", "invalid.host:9999" })
+    public void testInvalidHostPortConfig(String hostPort) throws Exception {
+        RestAssured.given()
+                .queryParam("hostPort", hostPort)
+                .get("/vertx-websocket/invalid/consumer/uri")
+                .then()
+                .statusCode(500)
+                .body(startsWith("Invalid host/port"));
     }
 
     @Test