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

dsmiley pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/main by this push:
     new 1962fc69a1d SOLR-18056: CloudSolrClient better urlScheme detection 
(from URL or solr.ssl.enabled) (#4162)
1962fc69a1d is described below

commit 1962fc69a1d8949a98d4dcd2b668ff0aae37de31
Author: Vishnu Priya <[email protected]>
AuthorDate: Thu Feb 26 19:50:06 2026 -0800

    SOLR-18056: CloudSolrClient better urlScheme detection (from URL or 
solr.ssl.enabled) (#4162)
    
    Improved CloudSolrClient's urlScheme detection by using the scheme of 
provided Solr URLs, or looking at "solr.ssl.enabled".
    
    Co-authored-by: David Smiley <[email protected]>
---
 changelog/unreleased/SOLR-18056-urlScheme-csp.yml  |  8 +++
 .../solrj/impl/ZkClientClusterStateProvider.java   | 19 ++++++-
 .../solrj/impl/BaseHttpClusterStateProvider.java   |  8 ++-
 .../solr/client/solrj/impl/CloudSolrClient.java    |  2 +-
 .../client/solrj/impl/ClusterStateProvider.java    |  3 ++
 .../solrj/impl/DelegatingClusterStateProvider.java |  8 +++
 .../solrj/impl/ClusterStateProviderTest.java       | 63 ++++++++++++++++++++++
 7 files changed, 108 insertions(+), 3 deletions(-)

diff --git a/changelog/unreleased/SOLR-18056-urlScheme-csp.yml 
b/changelog/unreleased/SOLR-18056-urlScheme-csp.yml
new file mode 100644
index 00000000000..f7a3d2690b1
--- /dev/null
+++ b/changelog/unreleased/SOLR-18056-urlScheme-csp.yml
@@ -0,0 +1,8 @@
+# See https://github.com/apache/solr/blob/main/dev-docs/changelog.adoc
+title: Improved CloudSolrClient's urlScheme detection by using the scheme of 
provided Solr URLs, or looking at "solr.ssl.enabled".
+type: changed
+authors:
+  - name: Vishnu Priya Chandra Sekar
+links:
+  - name: SOLR-18056
+    url: https://issues.apache.org/jira/browse/SOLR-18056
diff --git 
a/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/ZkClientClusterStateProvider.java
 
b/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/ZkClientClusterStateProvider.java
index 13e0dfab88c..b92dab8c362 100644
--- 
a/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/ZkClientClusterStateProvider.java
+++ 
b/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/ZkClientClusterStateProvider.java
@@ -35,6 +35,7 @@ import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkNodeProps;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.cloud.ZooKeeperException;
+import org.apache.solr.common.util.EnvUtils;
 import org.apache.solr.common.util.Utils;
 import org.apache.zookeeper.KeeperException;
 import org.noggit.JSONWriter;
@@ -45,7 +46,7 @@ import org.slf4j.LoggerFactory;
 public class ZkClientClusterStateProvider
     implements ClusterStateProvider, SolrZkClientTimeoutAware {
   private static final Logger log = 
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-
+  private static final String SOLR_SSL_ENABLED = "solr.ssl.enabled";
   volatile ZkStateReader zkStateReader;
   private boolean closeZkStateReader = true;
   private final String zkHost;
@@ -339,4 +340,20 @@ public class ZkClientClusterStateProvider
   public void setZkClientTimeout(int zkClientTimeout) {
     this.zkClientTimeout = zkClientTimeout;
   }
+
+  /**
+   * @return url scheme with the help of cluster property or environment 
variable.
+   */
+  @Override
+  public String getUrlScheme() {
+    final Boolean isSolrSslEnabled = 
EnvUtils.getPropertyAsBool(SOLR_SSL_ENABLED);
+    if (isSolrSslEnabled != null) {
+      return isSolrSslEnabled ? "https" : "http";
+    }
+    final Object urlSchemeClusterProperty = 
getClusterProperty(ClusterState.URL_SCHEME);
+    if (urlSchemeClusterProperty != null) {
+      return urlSchemeClusterProperty.toString();
+    }
+    return "http";
+  }
 }
diff --git 
a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/BaseHttpClusterStateProvider.java
 
b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/BaseHttpClusterStateProvider.java
index c477c55aca4..c9ae7b1bc7e 100644
--- 
a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/BaseHttpClusterStateProvider.java
+++ 
b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/BaseHttpClusterStateProvider.java
@@ -73,11 +73,12 @@ public abstract class BaseHttpClusterStateProvider 
implements ClusterStateProvid
       Executors.newSingleThreadScheduledExecutor(
           new SolrNamedThreadFactory("liveNodeReloadingExecutor"));
 
-  protected void initConfiguredNodes(List<String> solrUrls) throws Exception {
+  protected void initConfiguredNodes(List<String> solrUrls) {
     this.configuredNodes =
         solrUrls.stream()
             .map(BaseHttpClusterStateProvider::stringToUrl)
             .collect(Collectors.toList());
+    this.urlScheme = this.configuredNodes.get(0).getProtocol();
   }
 
   private static URL stringToUrl(String solrUrl) {
@@ -445,6 +446,11 @@ public abstract class BaseHttpClusterStateProvider 
implements ClusterStateProvid
     liveNodeReloadingService.shutdown();
   }
 
+  @Override
+  public String getUrlScheme() {
+    return this.urlScheme;
+  }
+
   private enum ClusterStateRequestType {
     FETCH_LIVE_NODES,
     FETCH_CLUSTER_PROP,
diff --git 
a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java 
b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java
index c9199fdafff..1a41044b793 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java
@@ -1452,7 +1452,7 @@ public abstract class CloudSolrClient extends SolrClient {
         requestRLTGenerator.getReplicaListTransformer(reqParams);
 
     final ClusterStateProvider provider = getClusterStateProvider();
-    final String urlScheme = 
provider.getClusterProperty(ClusterState.URL_SCHEME, "http");
+    final String urlScheme = provider.getUrlScheme();
     final Set<String> liveNodes = provider.getLiveNodes();
 
     final List<LBSolrClient.Endpoint> requestEndpoints =
diff --git 
a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ClusterStateProvider.java
 
b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ClusterStateProvider.java
index ce7c7f9c2e4..439363f9149 100644
--- 
a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ClusterStateProvider.java
+++ 
b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ClusterStateProvider.java
@@ -127,4 +127,7 @@ public interface ClusterStateProvider extends SolrCloseable 
{
   void connect();
 
   String getQuorumHosts();
+
+  /** Get url scheme like http or https but never null. */
+  String getUrlScheme();
 }
diff --git 
a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/DelegatingClusterStateProvider.java
 
b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/DelegatingClusterStateProvider.java
index ae089aeef89..019ef748f02 100644
--- 
a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/DelegatingClusterStateProvider.java
+++ 
b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/DelegatingClusterStateProvider.java
@@ -140,4 +140,12 @@ public class DelegatingClusterStateProvider implements 
ClusterStateProvider {
     }
     return null;
   }
+
+  @Override
+  public String getUrlScheme() {
+    if (delegate != null) {
+      return delegate.getUrlScheme();
+    }
+    return null;
+  }
 }
diff --git 
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/ClusterStateProviderTest.java
 
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/ClusterStateProviderTest.java
index 663fbf9eb1a..175264ede47 100644
--- 
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/ClusterStateProviderTest.java
+++ 
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/ClusterStateProviderTest.java
@@ -27,6 +27,7 @@ import 
com.carrotsearch.randomizedtesting.annotations.ParametersFactory;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.lang.reflect.InvocationTargetException;
+import java.nio.file.Path;
 import java.time.Instant;
 import java.util.List;
 import java.util.Map;
@@ -39,8 +40,13 @@ import 
org.apache.solr.client.solrj.jetty.HttpJettySolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.response.CollectionAdminResponse;
 import org.apache.solr.cloud.SolrCloudTestCase;
+import org.apache.solr.cloud.ZkController;
+import org.apache.solr.cloud.ZkTestServer;
+import org.apache.solr.common.cloud.ClusterProperties;
 import org.apache.solr.common.cloud.ClusterState;
 import org.apache.solr.common.cloud.DocCollection;
+import org.apache.solr.common.cloud.SolrZkClient;
+import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.util.NamedList;
 import org.eclipse.jetty.http.HttpField;
 import org.eclipse.jetty.http.HttpHeader;
@@ -54,6 +60,7 @@ import org.slf4j.LoggerFactory;
 public class ClusterStateProviderTest extends SolrCloudTestCase {
 
   private static final Logger log = 
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+  private static final String SOLR_SSL_ENABLED = "solr.ssl.enabled";
 
   static class UserAgentChangingJdkClient extends HttpJdkSolrClient {
 
@@ -435,6 +442,62 @@ public class ClusterStateProviderTest extends 
SolrCloudTestCase {
     }
   }
 
+  @Test
+  public void testHttpClusterStateProviderUrlScheme() throws Exception {
+    final List<String> solrUrls =
+        List.of("https://localhost:8983/solr";, "https://localhost:8984/solr";);
+    try (var httpClient = new HttpJettySolrClient.Builder().build();
+        ClusterStateProvider clusterStateProvider =
+            new HttpClusterStateProvider<>(solrUrls, httpClient)) {
+      assertEquals("https", clusterStateProvider.getUrlScheme());
+    }
+  }
+
+  @Test
+  public void testZkClusterStateProviderUrlScheme() throws Exception {
+    final Path zkDir = createTempDir("zkData");
+
+    final ZkTestServer server = new ZkTestServer(zkDir);
+    try {
+      server.run();
+      SolrZkClient client = new 
SolrZkClient.Builder().withUrl(server.getZkAddress()).build();
+      ZkController.createClusterZkNodes(client);
+      testUrlSchemeWithClusterProperties(client);
+      testUrlSchemeDefault(client);
+      testUrlSchemeWithSystemProperties(client);
+      client.close();
+    } finally {
+      server.shutdown();
+    }
+  }
+
+  private void testUrlSchemeDefault(SolrZkClient client) throws Exception {
+    try (var zkStateReader = new ZkStateReader(client);
+        var clusterStateProvider = new 
ZkClientClusterStateProvider(zkStateReader)) {
+      assertEquals("http", clusterStateProvider.getUrlScheme());
+    }
+  }
+
+  private void testUrlSchemeWithSystemProperties(SolrZkClient client) throws 
Exception {
+    System.setProperty(SOLR_SSL_ENABLED, "true");
+    try (var zkStateReader = new ZkStateReader(client);
+        var clusterStateProvider = new 
ZkClientClusterStateProvider(zkStateReader)) {
+      assertEquals("https", clusterStateProvider.getUrlScheme());
+    } finally {
+      System.clearProperty(SOLR_SSL_ENABLED);
+    }
+  }
+
+  private void testUrlSchemeWithClusterProperties(SolrZkClient client) throws 
Exception {
+    ClusterProperties cp = new ClusterProperties(client);
+    cp.setClusterProperty("urlScheme", "ftp");
+    try (var zkStateReader = new ZkStateReader(client);
+        var clusterStateProvider = new 
ZkClientClusterStateProvider(zkStateReader)) {
+      zkStateReader.createClusterStateWatchersAndUpdate();
+      assertEquals("ftp", clusterStateProvider.getUrlScheme());
+    }
+  }
+
   private void waitForCSPCacheTimeout() throws InterruptedException {
     Thread.sleep(2000);
   }

Reply via email to