Copy server port number from paren cannonical URL

When `gerrit.cannonicalWebUrl` contains port number it also must be
copied to the virutal host HTTP cannonical web url, otherwise
redirection URLs in Gerrit will not work.

Bug: Issue 307967275
Change-Id: Ic472438dbad44ae83445c257b7d6a859130dd431
diff --git a/src/main/java/com/gerritforge/gerrit/modules/virtualhost/VirtualHostHttpCanonicalWebUrlProvider.java b/src/main/java/com/gerritforge/gerrit/modules/virtualhost/VirtualHostHttpCanonicalWebUrlProvider.java
index d364d62..ffd2c89 100644
--- a/src/main/java/com/gerritforge/gerrit/modules/virtualhost/VirtualHostHttpCanonicalWebUrlProvider.java
+++ b/src/main/java/com/gerritforge/gerrit/modules/virtualhost/VirtualHostHttpCanonicalWebUrlProvider.java
@@ -14,38 +14,33 @@
 
 package com.gerritforge.gerrit.modules.virtualhost;
 
-import java.util.Optional;
-import java.util.function.Supplier;
-
-import org.eclipse.jgit.lib.Config;
-
 import com.google.common.annotations.VisibleForTesting;
 import com.google.gerrit.httpd.HttpCanonicalWebUrlProvider;
 import com.google.gerrit.server.config.GerritServerConfig;
 import com.google.inject.Inject;
+import java.net.URI;
+import java.util.Optional;
+import org.apache.http.client.utils.URIBuilder;
+import org.eclipse.jgit.lib.Config;
 
 public class VirtualHostHttpCanonicalWebUrlProvider extends HttpCanonicalWebUrlProvider {
-  private final String protocol;
+  private final URI serverUri;
 
   @Inject
   VirtualHostHttpCanonicalWebUrlProvider(@GerritServerConfig Config config) {
     super(config);
-    protocol = getWebProtocol(super.get());
+    serverUri = URI.create(super.get());
   }
 
   @Override
   public String get() {
-    return getVirtualHostHttpCanonicalWebUrl(protocol, CurrentServerName.get(), super::get);
+    return getVirtualHostHttpCanonicalWebUrl(serverUri, CurrentServerName.get());
   }
 
   @VisibleForTesting
-  static String getWebProtocol(String canonicalWebUrl) {
-    return canonicalWebUrl.startsWith("https://") ? "https://" : "http://";
-  }
-
-  @VisibleForTesting
-  static String getVirtualHostHttpCanonicalWebUrl(
-      String protocol, Optional<String> serverName, Supplier<String> httpCanonicalUrlSupplier) {
-    return serverName.map(name -> protocol + name + "/").orElseGet(httpCanonicalUrlSupplier);
+  static String getVirtualHostHttpCanonicalWebUrl(URI baseUri, Optional<String> serverName) {
+    return serverName
+        .map(name -> new URIBuilder(baseUri).setHost(name).toString())
+        .orElse(baseUri.toString());
   }
 }
diff --git a/src/test/java/com/gerritforge/gerrit/modules/virtualhost/VirtualHostHttpCanonicalWebUrlProviderTest.java b/src/test/java/com/gerritforge/gerrit/modules/virtualhost/VirtualHostHttpCanonicalWebUrlProviderTest.java
index 01cb7a9..d30ec10 100644
--- a/src/test/java/com/gerritforge/gerrit/modules/virtualhost/VirtualHostHttpCanonicalWebUrlProviderTest.java
+++ b/src/test/java/com/gerritforge/gerrit/modules/virtualhost/VirtualHostHttpCanonicalWebUrlProviderTest.java
@@ -16,35 +16,38 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import java.net.URI;
 import java.util.Optional;
-
 import org.junit.Test;
 
 public class VirtualHostHttpCanonicalWebUrlProviderTest {
   @Test
-  public void getWebProtocol() {
-    assertThat(VirtualHostHttpCanonicalWebUrlProvider.getWebProtocol("")).isEqualTo("http://");
-    assertThat(VirtualHostHttpCanonicalWebUrlProvider.getWebProtocol("https://localhost:8080/"))
-        .isEqualTo("https://");
-    assertThat(VirtualHostHttpCanonicalWebUrlProvider.getWebProtocol("http://localhost/"))
-        .isEqualTo("http://");
-  }
-
-  @Test
   public void buildFromServerName() {
+    URI baseUri = URI.create("http://failure.com/");
     String actual =
         VirtualHostHttpCanonicalWebUrlProvider.getVirtualHostHttpCanonicalWebUrl(
-            "http://", Optional.of("gerrithub.io"), () -> "failure.com");
+            baseUri, Optional.of("gerrithub.io"));
 
     assertThat(actual).isEqualTo("http://gerrithub.io/");
   }
 
   @Test
   public void fallbackToHttpCanonicalUrl() {
+    URI baseUri = URI.create("https://dom0.com/");
     String actual =
         VirtualHostHttpCanonicalWebUrlProvider.getVirtualHostHttpCanonicalWebUrl(
-            "https://", Optional.empty(), () -> "https://dom0.com/");
+            baseUri, Optional.empty());
 
     assertThat(actual).isEqualTo("https://dom0.com/");
   }
+
+  @Test
+  public void copyPortNumberFromCanonicalUrl() {
+    URI baseUri = URI.create("http://localhost:8080/");
+    String actual =
+        VirtualHostHttpCanonicalWebUrlProvider.getVirtualHostHttpCanonicalWebUrl(
+            baseUri, Optional.of("second.localhost"));
+
+    assertThat(actual).isEqualTo("http://second.localhost:8080/");
+  }
 }