diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgPermissionFilter.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgPermissionFilter.java index dde048a746..955002928c 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgPermissionFilter.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgPermissionFilter.java @@ -35,6 +35,7 @@ package sonia.scm.web; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableSet; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -81,20 +82,30 @@ public class HgPermissionFilter extends ProviderPermissionFilter @Override protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { - HgServletRequest hgRequest = new HgServletRequest(request); - super.doFilter(hgRequest, response, chain); - // TODO closing stream in case of fire? + super.doFilter(wrapRequestIfRequired(request), response, chain); + } + + @VisibleForTesting + HttpServletRequest wrapRequestIfRequired(HttpServletRequest request) { + if (isHttpPostArgsEnabled()) { + return new HgServletRequest(request); + } + return request; } @Override protected boolean isWriteRequest(HttpServletRequest request) { - if (repositoryHandler.getConfig().isEnableHttpPostArgs()) { + if (isHttpPostArgsEnabled()) { return isHttpPostArgsWriteRequest(request); } return isDefaultWriteRequest(request); } + private boolean isHttpPostArgsEnabled() { + return repositoryHandler.getConfig().isEnableHttpPostArgs(); + } + private boolean isHttpPostArgsWriteRequest(HttpServletRequest request) { return WireProtocol.isWriteRequest(request); } diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/web/HgPermissionFilterTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/web/HgPermissionFilterTest.java index f8aefb95d1..bb6692ffce 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/web/HgPermissionFilterTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/web/HgPermissionFilterTest.java @@ -44,8 +44,9 @@ import sonia.scm.repository.RepositoryProvider; import javax.servlet.http.HttpServletRequest; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.*; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static sonia.scm.web.WireProtocolRequestMockFactory.CMDS_HEADS_KNOWN_NODES; @@ -60,6 +61,9 @@ import static sonia.scm.web.WireProtocolRequestMockFactory.Namespace.PHASES; @RunWith(MockitoJUnitRunner.class) public class HgPermissionFilterTest { + @Mock + private HttpServletRequest request; + @Mock private ScmConfiguration configuration; @@ -79,6 +83,20 @@ public class HgPermissionFilterTest { when(hgRepositoryHandler.getConfig()).thenReturn(new HgConfig()); } + /** + * Tests {@link HgPermissionFilter#wrapRequestIfRequired(HttpServletRequest)}. + */ + @Test + public void testWrapRequestIfRequired() { + assertSame(request, filter.wrapRequestIfRequired(request)); + + HgConfig hgConfig = new HgConfig(); + hgConfig.setEnableHttpPostArgs(true); + when(hgRepositoryHandler.getConfig()).thenReturn(hgConfig); + + assertThat(filter.wrapRequestIfRequired(request), is(instanceOf(HgServletRequest.class))); + } + /** * Tests {@link HgPermissionFilter#isWriteRequest(HttpServletRequest)}. */