From 5b35fb2372515f45f336a13de5452119b2498c0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Tue, 11 Sep 2018 16:03:32 +0200 Subject: [PATCH] Fallback to configured base url if UriInfoStore not set --- .../scm/repository/spi/HttpScmProtocol.java | 9 ++--- .../InitializingHttpScmProtocolWrapper.java | 16 +++++++- .../repository/api/RepositoryServiceTest.java | 3 +- .../repository/spi/HttpScmProtocolTest.java | 40 +++++++++++++++++++ .../web/GitScmProtocolProviderWrapper.java | 5 ++- .../scm/web/HgScmProtocolProviderWrapper.java | 5 ++- .../web/SvnScmProtocolProviderWrapper.java | 5 ++- 7 files changed, 68 insertions(+), 15 deletions(-) create mode 100644 scm-core/src/test/java/sonia/scm/repository/spi/HttpScmProtocolTest.java diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/HttpScmProtocol.java b/scm-core/src/main/java/sonia/scm/repository/spi/HttpScmProtocol.java index b93deba10a..7ec47ea284 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/HttpScmProtocol.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/HttpScmProtocol.java @@ -7,18 +7,17 @@ import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.core.UriInfo; import java.io.IOException; import java.net.URI; public abstract class HttpScmProtocol implements ScmProtocol { private final Repository repository; - private final UriInfo uriInfo; + private final String basePath; - public HttpScmProtocol(Repository repository, UriInfo uriInfo) { + public HttpScmProtocol(Repository repository, String basePath) { this.repository = repository; - this.uriInfo = uriInfo; + this.basePath = basePath; } @Override @@ -28,7 +27,7 @@ public abstract class HttpScmProtocol implements ScmProtocol { @Override public String getUrl() { - return uriInfo.getBaseUri().resolve(URI.create("../../repo/" + repository.getNamespace() + "/" + repository.getName())).toASCIIString(); + return URI.create(basePath + "/").resolve("repo/" + repository.getNamespace() + "/" + repository.getName()).toASCIIString(); } public final void serve(HttpServletRequest request, HttpServletResponse response, ServletConfig config) throws ServletException, IOException { diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/InitializingHttpScmProtocolWrapper.java b/scm-core/src/main/java/sonia/scm/repository/spi/InitializingHttpScmProtocolWrapper.java index 3d4d3c6205..b54b5c812c 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/InitializingHttpScmProtocolWrapper.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/InitializingHttpScmProtocolWrapper.java @@ -3,6 +3,7 @@ package sonia.scm.repository.spi; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.api.v2.resources.UriInfoStore; +import sonia.scm.config.ScmConfiguration; import sonia.scm.repository.Repository; import sonia.scm.web.filter.PermissionFilter; @@ -21,14 +22,16 @@ public abstract class InitializingHttpScmProtocolWrapper { private final Provider delegateProvider; private final Provider permissionFilterProvider; private final Provider uriInfoStore; + private final ScmConfiguration scmConfiguration; private volatile boolean isInitialized = false; - protected InitializingHttpScmProtocolWrapper(Provider delegateProvider, Provider permissionFilterProvider, Provider uriInfoStore) { + protected InitializingHttpScmProtocolWrapper(Provider delegateProvider, Provider permissionFilterProvider, Provider uriInfoStore, ScmConfiguration scmConfiguration) { this.delegateProvider = delegateProvider; this.permissionFilterProvider = permissionFilterProvider; this.uriInfoStore = uriInfoStore; + this.scmConfiguration = scmConfiguration; } protected void initializeServlet(ServletConfig config, ScmProviderHttpServlet httpServlet) throws ServletException { @@ -39,10 +42,18 @@ public abstract class InitializingHttpScmProtocolWrapper { return new ProtocolWrapper(repository); } + private String computeBasePath() { + if (uriInfoStore.get() != null) { + return uriInfoStore.get().get().getBaseUri().resolve("../..").toASCIIString(); + } else { + return scmConfiguration.getBaseUrl(); + } + } + private class ProtocolWrapper extends HttpScmProtocol { public ProtocolWrapper(Repository repository) { - super(repository, uriInfoStore.get().get()); + super(repository, computeBasePath()); } @Override @@ -63,5 +74,6 @@ public abstract class InitializingHttpScmProtocolWrapper { repository, () -> delegateProvider.get().service(request, response, repository)); } + } } diff --git a/scm-core/src/test/java/sonia/scm/repository/api/RepositoryServiceTest.java b/scm-core/src/test/java/sonia/scm/repository/api/RepositoryServiceTest.java index 1783d17936..9cb398b571 100644 --- a/scm-core/src/test/java/sonia/scm/repository/api/RepositoryServiceTest.java +++ b/scm-core/src/test/java/sonia/scm/repository/api/RepositoryServiceTest.java @@ -8,7 +8,6 @@ import sonia.scm.repository.spi.RepositoryServiceProvider; import javax.servlet.ServletConfig; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.core.UriInfo; import java.util.Collection; import java.util.Collections; @@ -46,7 +45,7 @@ public class RepositoryServiceTest { private static class DummyHttpProtocol extends HttpScmProtocol { public DummyHttpProtocol(Repository repository) { - super(repository, mock(UriInfo.class)); + super(repository, ""); } @Override diff --git a/scm-core/src/test/java/sonia/scm/repository/spi/HttpScmProtocolTest.java b/scm-core/src/test/java/sonia/scm/repository/spi/HttpScmProtocolTest.java new file mode 100644 index 0000000000..1fd772fee3 --- /dev/null +++ b/scm-core/src/test/java/sonia/scm/repository/spi/HttpScmProtocolTest.java @@ -0,0 +1,40 @@ +package sonia.scm.repository.spi; + +import org.junit.jupiter.api.DynamicTest; +import org.junit.jupiter.api.TestFactory; +import sonia.scm.repository.Repository; + +import javax.servlet.ServletConfig; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; + +class HttpScmProtocolTest { + + @TestFactory + Stream shouldCreateCorrectUrlsWithContextPath() { + return Stream.of("http://localhost/scm", "http://localhost/scm/") + .map(url -> assertResultingUrl(url, "http://localhost/scm/repo/space/name")); + } + + @TestFactory + Stream shouldCreateCorrectUrlsWithPort() { + return Stream.of("http://localhost:8080", "http://localhost:8080/") + .map(url -> assertResultingUrl(url, "http://localhost:8080/repo/space/name")); + } + + DynamicTest assertResultingUrl(String baseUrl, String expectedUrl) { + String actualUrl = createInstanceOfHttpScmProtocol(baseUrl).getUrl(); + return DynamicTest.dynamicTest(baseUrl + " -> " + expectedUrl, () -> assertThat(actualUrl).isEqualTo(expectedUrl)); + } + + private HttpScmProtocol createInstanceOfHttpScmProtocol(String baseUrl) { + return new HttpScmProtocol(new Repository("", "", "space", "name"), baseUrl) { + @Override + protected void serve(HttpServletRequest request, HttpServletResponse response, Repository repository, ServletConfig config) { + } + }; + } +} diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitScmProtocolProviderWrapper.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitScmProtocolProviderWrapper.java index ae378c2439..cda8431283 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitScmProtocolProviderWrapper.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitScmProtocolProviderWrapper.java @@ -1,6 +1,7 @@ package sonia.scm.web; import sonia.scm.api.v2.resources.UriInfoStore; +import sonia.scm.config.ScmConfiguration; import sonia.scm.repository.spi.InitializingHttpScmProtocolWrapper; import javax.inject.Inject; @@ -10,7 +11,7 @@ import javax.inject.Singleton; @Singleton public class GitScmProtocolProviderWrapper extends InitializingHttpScmProtocolWrapper { @Inject - public GitScmProtocolProviderWrapper(Provider servletProvider, Provider permissionFilter, Provider uriInfoStore) { - super(servletProvider, permissionFilter, uriInfoStore); + public GitScmProtocolProviderWrapper(Provider servletProvider, Provider permissionFilter, Provider uriInfoStore, ScmConfiguration scmConfiguration) { + super(servletProvider, permissionFilter, uriInfoStore, scmConfiguration); } } diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgScmProtocolProviderWrapper.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgScmProtocolProviderWrapper.java index ba5c40e7f9..9cb22363ce 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgScmProtocolProviderWrapper.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgScmProtocolProviderWrapper.java @@ -1,6 +1,7 @@ package sonia.scm.web; import sonia.scm.api.v2.resources.UriInfoStore; +import sonia.scm.config.ScmConfiguration; import sonia.scm.repository.spi.InitializingHttpScmProtocolWrapper; import javax.inject.Inject; @@ -10,7 +11,7 @@ import javax.inject.Singleton; @Singleton public class HgScmProtocolProviderWrapper extends InitializingHttpScmProtocolWrapper { @Inject - public HgScmProtocolProviderWrapper(Provider servletProvider, Provider permissionFilter, Provider uriInfoStore) { - super(servletProvider, permissionFilter, uriInfoStore); + public HgScmProtocolProviderWrapper(Provider servletProvider, Provider permissionFilter, Provider uriInfoStore, ScmConfiguration scmConfiguration) { + super(servletProvider, permissionFilter, uriInfoStore, scmConfiguration); } } diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnScmProtocolProviderWrapper.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnScmProtocolProviderWrapper.java index 4f96059429..99f5b42fb2 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnScmProtocolProviderWrapper.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnScmProtocolProviderWrapper.java @@ -1,6 +1,7 @@ package sonia.scm.web; import sonia.scm.api.v2.resources.UriInfoStore; +import sonia.scm.config.ScmConfiguration; import sonia.scm.repository.spi.InitializingHttpScmProtocolWrapper; import sonia.scm.repository.spi.ScmProviderHttpServlet; @@ -18,8 +19,8 @@ public class SvnScmProtocolProviderWrapper extends InitializingHttpScmProtocolWr public static final String PARAMETER_SVN_PARENTPATH = "SVNParentPath"; @Inject - public SvnScmProtocolProviderWrapper(Provider servletProvider, Provider permissionFilter, Provider uriInfoStore) { - super(servletProvider, permissionFilter, uriInfoStore); + public SvnScmProtocolProviderWrapper(Provider servletProvider, Provider permissionFilter, Provider uriInfoStore, ScmConfiguration scmConfiguration) { + super(servletProvider, permissionFilter, uriInfoStore, scmConfiguration); } @Override