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

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


The following commit(s) were added to refs/heads/branch_9x by this push:
     new bae6239066a Apply fix for special hostContext (#2787)
bae6239066a is described below

commit bae6239066ac0dcb2e443c0db657196f418b8138
Author: Christos Malliaridis <[email protected]>
AuthorDate: Wed Oct 23 21:02:40 2024 +0200

    Apply fix for special hostContext (#2787)
    
    This commit leverages UriBuilder over custom URI path concatenation.
    
    Related to changes from SOLR-17450.
---
 .../src/java/org/apache/solr/cli/PostTool.java     | 48 ++++++---------
 .../java/org/apache/solr/cli/SimplePostTool.java   | 72 +++++++++-------------
 .../core/src/java/org/apache/solr/cli/SolrCLI.java |  2 +-
 .../src/test/org/apache/solr/cli/PostToolTest.java | 22 -------
 .../org/apache/solr/cli/SimplePostToolTest.java    | 22 -------
 5 files changed, 47 insertions(+), 119 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/cli/PostTool.java 
b/solr/core/src/java/org/apache/solr/cli/PostTool.java
index 275067fb34e..23a1cb17724 100644
--- a/solr/core/src/java/org/apache/solr/cli/PostTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/PostTool.java
@@ -19,6 +19,7 @@ package org.apache.solr.cli;
 import static java.nio.charset.StandardCharsets.US_ASCII;
 import static java.nio.charset.StandardCharsets.UTF_8;
 
+import jakarta.ws.rs.core.UriBuilder;
 import java.io.BufferedReader;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -330,15 +331,24 @@ public class PostTool extends ToolBase {
       }
 
       solrUrl = SolrCLI.normalizeSolrUrl(solrUrl, true, hostContext) + 
hostContext;
-      String url = solrUrl + "/" + cli.getOptionValue("name") + "/update";
-      solrUpdateUrl = new URI(url);
+
+      solrUpdateUrl =
+          UriBuilder.fromUri(SolrCLI.normalizeSolrUrl(solrUrl, true, 
hostContext))
+              .path(hostContext)
+              .path(cli.getOptionValue("name"))
+              .path("update")
+              .build();
 
     } else if (cli.hasOption("solr-update-url")) {
       String url = cli.getOptionValue("solr-update-url");
       solrUpdateUrl = new URI(url);
     } else if (cli.hasOption("name")) {
-      String url = SolrCLI.getDefaultSolrUrl() + "/solr/" + 
cli.getOptionValue("name") + "/update";
-      solrUpdateUrl = new URI(url);
+      solrUpdateUrl =
+          UriBuilder.fromUri(SolrCLI.getDefaultSolrUrl())
+              .path("solr")
+              .path(cli.getOptionValue("name"))
+              .path("update")
+              .build();
     } else {
       throw new IllegalArgumentException(
           "Must specify either --solr-update-url or -c parameter to post 
documents.");
@@ -450,7 +460,7 @@ public class PostTool extends ToolBase {
     }
 
     // Set Extracting handler as default
-    solrUpdateUrl = appendUrlPath(solrUpdateUrl, "/extract");
+    solrUpdateUrl = UriBuilder.fromUri(solrUpdateUrl).path("extract").build();
 
     info("Posting web pages to Solr url " + solrUpdateUrl);
     auto = true;
@@ -896,7 +906,7 @@ public class PostTool extends ToolBase {
       // TODO: from being interpreted as Solr documents internally
       if (type.equals("application/json") && 
!PostTool.FORMAT_SOLR.equals(format)) {
         suffix = "/json/docs";
-        String urlStr = appendUrlPath(solrUpdateUrl, suffix).toString();
+        String urlStr = 
UriBuilder.fromUri(solrUpdateUrl).path(suffix).build().toString();
         uri = new URI(urlStr);
       } else if (type.equals("application/xml")
           || type.equals("text/csv")
@@ -905,7 +915,8 @@ public class PostTool extends ToolBase {
       } else {
         // SolrCell
         suffix = "/extract";
-        String urlStr = appendUrlPath(solrUpdateUrl, suffix).toString();
+        String urlStr = 
UriBuilder.fromUri(solrUpdateUrl).path(suffix).build().toString();
+        ;
         if (!urlStr.contains("resource.name")) {
           urlStr =
               appendParam(
@@ -953,29 +964,6 @@ public class PostTool extends ToolBase {
     }
   }
 
-  /**
-   * Appends to the path of the URL
-   *
-   * @param uri the URI
-   * @param append the path to append
-   * @return the final URL version
-   */
-  protected static URI appendUrlPath(URI uri, String append) {
-    if (append == null || append.isEmpty()) {
-      return uri;
-    }
-    if (append.startsWith("/")) {
-      append = append.substring(1);
-    }
-    if (uri.getQuery() != null && !uri.getQuery().isEmpty()) {
-      append += "?" + uri.getQuery();
-    }
-    if (!uri.getPath().endsWith("/")) {
-      append = uri.getPath() + "/" + append;
-    }
-    return uri.resolve(append);
-  }
-
   /**
    * Guesses the type of file, based on file name suffix Returns 
"application/octet-stream" if no
    * corresponding mimeMap type.
diff --git a/solr/core/src/java/org/apache/solr/cli/SimplePostTool.java 
b/solr/core/src/java/org/apache/solr/cli/SimplePostTool.java
index fa5cf60db66..00236ce6c57 100644
--- a/solr/core/src/java/org/apache/solr/cli/SimplePostTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/SimplePostTool.java
@@ -19,6 +19,7 @@ package org.apache.solr.cli;
 import static java.nio.charset.StandardCharsets.US_ASCII;
 import static java.nio.charset.StandardCharsets.UTF_8;
 
+import jakarta.ws.rs.core.UriBuilder;
 import java.io.BufferedReader;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -377,38 +378,34 @@ public class SimplePostTool {
   private void doWebMode() {
     reset();
     int numPagesPosted = 0;
-    try {
-      if (type != null) {
-        fatal("Specifying content-type with \"-Ddata=web\" is not supported");
-      }
-      if (args[0].equals("-")) {
-        // Skip posting url if special param "-" given
-        return;
-      }
-      // Set Extracting handler as default
-      solrUrl = appendUrlPath(solrUrl, "/extract");
+    if (type != null) {
+      fatal("Specifying content-type with \"-Ddata=web\" is not supported");
+    }
+    if (args[0].equals("-")) {
+      // Skip posting url if special param "-" given
+      return;
+    }
+    // Set Extracting handler as default
+    solrUrl = UriBuilder.fromUri(solrUrl).path("/extract").build();
 
-      info("Posting web pages to Solr url " + solrUrl);
-      auto = true;
-      info(
-          "Entering auto mode. Indexing pages with content-types corresponding 
to file endings "
-              + fileTypes);
-      if (recursive > 0) {
-        if (recursive > MAX_WEB_DEPTH) {
-          recursive = MAX_WEB_DEPTH;
-          warn("Too large recursion depth for web mode, limiting to " + 
MAX_WEB_DEPTH + "...");
-        }
-        if (delay < DEFAULT_WEB_DELAY) {
-          warn(
-              "Never crawl an external web site faster than every 10 seconds, 
your IP will probably be blocked");
-        }
-        info("Entering recursive mode, depth=" + recursive + ", delay=" + 
delay + "s");
+    info("Posting web pages to Solr url " + solrUrl);
+    auto = true;
+    info(
+        "Entering auto mode. Indexing pages with content-types corresponding 
to file endings "
+            + fileTypes);
+    if (recursive > 0) {
+      if (recursive > MAX_WEB_DEPTH) {
+        recursive = MAX_WEB_DEPTH;
+        warn("Too large recursion depth for web mode, limiting to " + 
MAX_WEB_DEPTH + "...");
       }
-      numPagesPosted = postWebPages(args, 0, out);
-      info(numPagesPosted + " web pages indexed.");
-    } catch (URISyntaxException e) {
-      fatal("Wrong URL trying to append /extract to " + solrUrl);
+      if (delay < DEFAULT_WEB_DELAY) {
+        warn(
+            "Never crawl an external web site faster than every 10 seconds, 
your IP will probably be blocked");
+      }
+      info("Entering recursive mode, depth=" + recursive + ", delay=" + delay 
+ "s");
     }
+    numPagesPosted = postWebPages(args, 0, out);
+    info(numPagesPosted + " web pages indexed.");
   }
 
   private void doStdinMode() {
@@ -862,7 +859,7 @@ public class SimplePostTool {
         // TODO: from being interpreted as Solr documents internally
         if (type.equals("application/json") && !FORMAT_SOLR.equals(format)) {
           suffix = "/json/docs";
-          String urlStr = appendUrlPath(solrUrl, suffix).toString();
+          String urlStr = 
UriBuilder.fromUri(solrUrl).path(suffix).build().toString();
           url = URI.create(urlStr);
         } else if (type.equals("application/xml")
             || type.equals("text/csv")
@@ -871,7 +868,7 @@ public class SimplePostTool {
         } else {
           // SolrCell
           suffix = "/extract";
-          String urlStr = appendUrlPath(solrUrl, suffix).toString();
+          String urlStr = 
UriBuilder.fromUri(solrUrl).path(suffix).build().toString();
           if (!urlStr.contains("resource.name")) {
             urlStr =
                 appendParam(
@@ -898,8 +895,6 @@ public class SimplePostTool {
               + (mockMode ? " MOCK!" : ""));
       is = new FileInputStream(file);
       postData(is, file.length(), output, type, url);
-    } catch (URISyntaxException e) {
-      warn("Not valid URL");
     } catch (IOException e) {
       warn("Can't open/read file: " + file);
     } finally {
@@ -913,17 +908,6 @@ public class SimplePostTool {
     }
   }
 
-  /**
-   * Appends to the path of the URI
-   *
-   * @param uri the URI
-   * @param append the path to append
-   * @return the final URI version
-   */
-  protected static URI appendUrlPath(URI uri, String append) throws 
URISyntaxException {
-    return PostTool.appendUrlPath(uri, append);
-  }
-
   /**
    * Guesses the type of file, based on file name suffix Returns 
"application/octet-stream" if no
    * corresponding mimeMap type.
diff --git a/solr/core/src/java/org/apache/solr/cli/SolrCLI.java 
b/solr/core/src/java/org/apache/solr/cli/SolrCLI.java
index 74c4f7fb604..56abba7c4d2 100755
--- a/solr/core/src/java/org/apache/solr/cli/SolrCLI.java
+++ b/solr/core/src/java/org/apache/solr/cli/SolrCLI.java
@@ -739,7 +739,7 @@ public class SolrCLI implements CLIO {
         hostContext = hostContext.substring(0, hostContext.length() - 1);
       }
       // Only consider URI path component when normalizing hostContext
-      if (urlPath.contains(hostContext)) {
+      if (hostContext != null && !hostContext.isBlank() && 
urlPath.contains(hostContext)) {
         String newSolrUrl =
             uri.resolve(urlPath.substring(0, urlPath.indexOf(hostContext)) + 
"/").toString();
         if (logUrlFormatWarning) {
diff --git a/solr/core/src/test/org/apache/solr/cli/PostToolTest.java 
b/solr/core/src/test/org/apache/solr/cli/PostToolTest.java
index 7488988c7d9..b4f729c212f 100644
--- a/solr/core/src/test/org/apache/solr/cli/PostToolTest.java
+++ b/solr/core/src/test/org/apache/solr/cli/PostToolTest.java
@@ -239,28 +239,6 @@ public class PostToolTest extends SolrCloudTestCase {
         PostTool.appendParam("http://[ff01::114]/?a=b";, "foo=bar"));
   }
 
-  @Test
-  public void testAppendUrlPath() {
-    assertEquals(
-        URI.create("http://[ff01::114]/a?foo=bar";),
-        PostTool.appendUrlPath(URI.create("http://[ff01::114]?foo=bar";), 
"/a"));
-    assertEquals(
-        URI.create("http://[ff01::114]/a?foo=bar";),
-        PostTool.appendUrlPath(URI.create("http://[ff01::114]/?foo=bar";), 
"/a"));
-    assertEquals(
-        URI.create("http://[ff01::114]/a/b?foo=bar";),
-        PostTool.appendUrlPath(URI.create("http://[ff01::114]/a?foo=bar";), 
"/b"));
-    assertEquals(
-        URI.create("http://[ff01::114]/a/b?foo=bar";),
-        PostTool.appendUrlPath(URI.create("http://[ff01::114]/a/?foo=bar";), 
"/b"));
-    assertEquals(
-        URI.create("http://[ff01::114]/a/b?foo=bar";),
-        PostTool.appendUrlPath(URI.create("http://[ff01::114]/a?foo=bar";), 
"b"));
-    assertEquals(
-        URI.create("http://[ff01::114]/a/b?foo=bar";),
-        PostTool.appendUrlPath(URI.create("http://[ff01::114]/a/?foo=bar";), 
"b"));
-  }
-
   @Test
   public void testGuessType() {
     File f = new File("foo.doc");
diff --git a/solr/core/src/test/org/apache/solr/cli/SimplePostToolTest.java 
b/solr/core/src/test/org/apache/solr/cli/SimplePostToolTest.java
index d8974c0fe68..c59d637bf0a 100644
--- a/solr/core/src/test/org/apache/solr/cli/SimplePostToolTest.java
+++ b/solr/core/src/test/org/apache/solr/cli/SimplePostToolTest.java
@@ -155,28 +155,6 @@ public class SimplePostToolTest extends SolrTestCaseJ4 {
         SimplePostTool.appendParam("http://[ff01::114]/?a=b";, "foo=bar"));
   }
 
-  @Test
-  public void testAppendUrlPath() throws URISyntaxException {
-    assertEquals(
-        URI.create("http://[ff01::114]/a?foo=bar";),
-        SimplePostTool.appendUrlPath(URI.create("http://[ff01::114]?foo=bar";), 
"/a"));
-    assertEquals(
-        URI.create("http://[ff01::114]/a?foo=bar";),
-        
SimplePostTool.appendUrlPath(URI.create("http://[ff01::114]/?foo=bar";), "/a"));
-    assertEquals(
-        URI.create("http://[ff01::114]/a/b?foo=bar";),
-        
SimplePostTool.appendUrlPath(URI.create("http://[ff01::114]/a?foo=bar";), "/b"));
-    assertEquals(
-        URI.create("http://[ff01::114]/a/b?foo=bar";),
-        
SimplePostTool.appendUrlPath(URI.create("http://[ff01::114]/a/?foo=bar";), 
"/b"));
-    assertEquals(
-        URI.create("http://[ff01::114]/a/b?foo=bar";),
-        
SimplePostTool.appendUrlPath(URI.create("http://[ff01::114]/a?foo=bar";), "b"));
-    assertEquals(
-        URI.create("http://[ff01::114]/a/b?foo=bar";),
-        
SimplePostTool.appendUrlPath(URI.create("http://[ff01::114]/a/?foo=bar";), "b"));
-  }
-
   @Test
   public void testGuessType() {
     File f = new File("foo.doc");

Reply via email to