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

cwylie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git


The following commit(s) were added to refs/heads/master by this push:
     new 11017ef  support jdbc even if trailing / is missing (#11737)
11017ef is described below

commit 11017ef00a5f02cf56737b96f402e05410449dc3
Author: Clint Wylie <[email protected]>
AuthorDate: Wed Sep 29 13:59:26 2021 -0700

    support jdbc even if trailing / is missing (#11737)
    
    * support jdbc even if trailing / is missing
    
    * fix tests
---
 .../security/AbstractAuthConfigurationTest.java    |  2 ++
 .../druid/cli/RouterJettyServerInitializer.java    |  4 ++-
 .../druid/sql/avatica/DruidAvaticaJsonHandler.java |  4 ++-
 .../sql/avatica/DruidAvaticaProtobufHandler.java   |  4 ++-
 .../druid/sql/avatica/DruidAvaticaHandlerTest.java | 35 +++++++++++++++-------
 5 files changed, 35 insertions(+), 14 deletions(-)

diff --git 
a/integration-tests/src/test/java/org/apache/druid/tests/security/AbstractAuthConfigurationTest.java
 
b/integration-tests/src/test/java/org/apache/druid/tests/security/AbstractAuthConfigurationTest.java
index e97c353..42556ad 100644
--- 
a/integration-tests/src/test/java/org/apache/druid/tests/security/AbstractAuthConfigurationTest.java
+++ 
b/integration-tests/src/test/java/org/apache/druid/tests/security/AbstractAuthConfigurationTest.java
@@ -445,12 +445,14 @@ public abstract class AbstractAuthConfigurationTest
   public void test_avaticaQuery_broker()
   {
     testAvaticaQuery(getBrokerAvacticaUrl());
+    
testAvaticaQuery(StringUtils.maybeRemoveTrailingSlash(getBrokerAvacticaUrl()));
   }
 
   @Test
   public void test_avaticaQuery_router()
   {
     testAvaticaQuery(getRouterAvacticaUrl());
+    
testAvaticaQuery(StringUtils.maybeRemoveTrailingSlash(getRouterAvacticaUrl()));
   }
 
   @Test
diff --git 
a/services/src/main/java/org/apache/druid/cli/RouterJettyServerInitializer.java 
b/services/src/main/java/org/apache/druid/cli/RouterJettyServerInitializer.java
index 1850de5..a959f91 100644
--- 
a/services/src/main/java/org/apache/druid/cli/RouterJettyServerInitializer.java
+++ 
b/services/src/main/java/org/apache/druid/cli/RouterJettyServerInitializer.java
@@ -59,7 +59,9 @@ public class RouterJettyServerInitializer implements 
JettyServerInitializer
       // The router will keep the connection context in the forwarded message, 
and the broker is responsible for
       // performing the auth checks.
       DruidAvaticaJsonHandler.AVATICA_PATH,
-      DruidAvaticaProtobufHandler.AVATICA_PATH
+      DruidAvaticaJsonHandler.AVATICA_PATH_NO_TRAILING_SLASH,
+      DruidAvaticaProtobufHandler.AVATICA_PATH,
+      DruidAvaticaProtobufHandler.AVATICA_PATH_NO_TRAILING_SLASH
   );
 
   private final DruidHttpClientConfig routerHttpClientConfig;
diff --git 
a/sql/src/main/java/org/apache/druid/sql/avatica/DruidAvaticaJsonHandler.java 
b/sql/src/main/java/org/apache/druid/sql/avatica/DruidAvaticaJsonHandler.java
index ffb1107..e2d223d 100644
--- 
a/sql/src/main/java/org/apache/druid/sql/avatica/DruidAvaticaJsonHandler.java
+++ 
b/sql/src/main/java/org/apache/druid/sql/avatica/DruidAvaticaJsonHandler.java
@@ -24,6 +24,7 @@ import org.apache.calcite.avatica.remote.LocalService;
 import org.apache.calcite.avatica.remote.Service;
 import org.apache.calcite.avatica.server.AvaticaJsonHandler;
 import org.apache.druid.guice.annotations.Self;
+import org.apache.druid.java.util.common.StringUtils;
 import org.apache.druid.server.DruidNode;
 import org.eclipse.jetty.server.Request;
 
@@ -35,6 +36,7 @@ import java.io.IOException;
 public class DruidAvaticaJsonHandler extends AvaticaJsonHandler
 {
   public static final String AVATICA_PATH = "/druid/v2/sql/avatica/";
+  public static final String AVATICA_PATH_NO_TRAILING_SLASH = 
"/druid/v2/sql/avatica";
 
   @Inject
   public DruidAvaticaJsonHandler(
@@ -55,7 +57,7 @@ public class DruidAvaticaJsonHandler extends 
AvaticaJsonHandler
       final HttpServletResponse response
   ) throws IOException, ServletException
   {
-    if (request.getRequestURI().equals(AVATICA_PATH)) {
+    if 
(AVATICA_PATH_NO_TRAILING_SLASH.equals(StringUtils.maybeRemoveTrailingSlash(request.getRequestURI())))
 {
       super.handle(target, baseRequest, request, response);
     }
   }
diff --git 
a/sql/src/main/java/org/apache/druid/sql/avatica/DruidAvaticaProtobufHandler.java
 
b/sql/src/main/java/org/apache/druid/sql/avatica/DruidAvaticaProtobufHandler.java
index 8bc9f33..50c54ad 100644
--- 
a/sql/src/main/java/org/apache/druid/sql/avatica/DruidAvaticaProtobufHandler.java
+++ 
b/sql/src/main/java/org/apache/druid/sql/avatica/DruidAvaticaProtobufHandler.java
@@ -24,6 +24,7 @@ import org.apache.calcite.avatica.remote.LocalService;
 import org.apache.calcite.avatica.remote.Service;
 import org.apache.calcite.avatica.server.AvaticaProtobufHandler;
 import org.apache.druid.guice.annotations.Self;
+import org.apache.druid.java.util.common.StringUtils;
 import org.apache.druid.server.DruidNode;
 import org.eclipse.jetty.server.Request;
 
@@ -35,6 +36,7 @@ import java.io.IOException;
 public class DruidAvaticaProtobufHandler extends AvaticaProtobufHandler
 {
   public static final String AVATICA_PATH = "/druid/v2/sql/avatica-protobuf/";
+  public static final String AVATICA_PATH_NO_TRAILING_SLASH = 
"/druid/v2/sql/avatica-protobuf";
 
   @Inject
   public DruidAvaticaProtobufHandler(
@@ -55,7 +57,7 @@ public class DruidAvaticaProtobufHandler extends 
AvaticaProtobufHandler
       final HttpServletResponse response
   ) throws IOException, ServletException
   {
-    if (request.getRequestURI().equals(AVATICA_PATH)) {
+    if 
(AVATICA_PATH_NO_TRAILING_SLASH.equals(StringUtils.maybeRemoveTrailingSlash(request.getRequestURI())))
 {
       super.handle(target, baseRequest, request, response);
     }
   }
diff --git 
a/sql/src/test/java/org/apache/druid/sql/avatica/DruidAvaticaHandlerTest.java 
b/sql/src/test/java/org/apache/druid/sql/avatica/DruidAvaticaHandlerTest.java
index 3934665..91d83fa 100644
--- 
a/sql/src/test/java/org/apache/druid/sql/avatica/DruidAvaticaHandlerTest.java
+++ 
b/sql/src/test/java/org/apache/druid/sql/avatica/DruidAvaticaHandlerTest.java
@@ -115,7 +115,7 @@ public abstract class DruidAvaticaHandlerTest extends 
CalciteTestBase
     public int getMaxConnections()
     {
       // This must match the number of Connection objects created in setUp()
-      return 3;
+      return 4;
     }
 
     @Override
@@ -156,6 +156,7 @@ public abstract class DruidAvaticaHandlerTest extends 
CalciteTestBase
   private SpecificSegmentsQuerySegmentWalker walker;
   private Server server;
   private Connection client;
+  private Connection clientNoTrailingSlash;
   private Connection superuserClient;
   private Connection clientLosAngeles;
   private DruidMeta druidMeta;
@@ -221,6 +222,7 @@ public abstract class DruidAvaticaHandlerTest extends 
CalciteTestBase
     url = this.getJdbcConnectionString(port);
     client = DriverManager.getConnection(url, "regularUser", "druid");
     superuserClient = DriverManager.getConnection(url, 
CalciteTests.TEST_SUPERUSER_NAME, "druid");
+    clientNoTrailingSlash = 
DriverManager.getConnection(StringUtils.maybeRemoveTrailingSlash(url), 
CalciteTests.TEST_SUPERUSER_NAME, "druid");
 
     final Properties propertiesLosAngeles = new Properties();
     propertiesLosAngeles.setProperty("sqlTimeZone", "America/Los_Angeles");
@@ -234,11 +236,13 @@ public abstract class DruidAvaticaHandlerTest extends 
CalciteTestBase
   {
     client.close();
     clientLosAngeles.close();
+    clientNoTrailingSlash.close();
     server.stop();
     walker.close();
     walker = null;
     client = null;
     clientLosAngeles = null;
+    clientNoTrailingSlash = null;
     server = null;
   }
 
@@ -256,6 +260,19 @@ public abstract class DruidAvaticaHandlerTest extends 
CalciteTestBase
   }
 
   @Test
+  public void testSelectCountNoTrailingSlash() throws Exception
+  {
+    final ResultSet resultSet = 
clientNoTrailingSlash.createStatement().executeQuery("SELECT COUNT(*) AS cnt 
FROM druid.foo");
+    final List<Map<String, Object>> rows = getRows(resultSet);
+    Assert.assertEquals(
+        ImmutableList.of(
+            ImmutableMap.of("cnt", 6L)
+        ),
+        rows
+    );
+  }
+
+  @Test
   public void testSelectCountAlternateStyle() throws Exception
   {
     final ResultSet resultSet = client.prepareStatement("SELECT COUNT(*) AS 
cnt FROM druid.foo").executeQuery();
@@ -811,19 +828,15 @@ public abstract class DruidAvaticaHandlerTest extends 
CalciteTestBase
   @Test
   public void testTooManyConnections() throws Exception
   {
-    final Connection connection1 = DriverManager.getConnection(url);
-    final Statement statement1 = connection1.createStatement();
-
-    final Connection connection2 = DriverManager.getConnection(url);
-    final Statement statement2 = connection2.createStatement();
-
-    final Connection connection3 = DriverManager.getConnection(url);
-    final Statement statement3 = connection3.createStatement();
+    client.createStatement();
+    clientLosAngeles.createStatement();
+    superuserClient.createStatement();
+    clientNoTrailingSlash.createStatement();
 
     expectedException.expect(AvaticaClientRuntimeException.class);
-    expectedException.expectMessage("Too many connections, limit is[3]");
+    expectedException.expectMessage("Too many connections, limit is[4]");
 
-    final Connection connection4 = DriverManager.getConnection(url);
+    final Connection connection5 = DriverManager.getConnection(url);
   }
 
   @Test

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to