allow changing of context path with a http header

This commit is contained in:
Sebastian Sdorra
2013-08-27 13:22:03 +02:00
parent 69715bf7d3
commit 9adab9c4e3

View File

@@ -45,8 +45,8 @@ import org.tmatesoft.svn.core.internal.server.dav.DAVConfig;
import org.tmatesoft.svn.core.internal.server.dav.DAVServlet; import org.tmatesoft.svn.core.internal.server.dav.DAVServlet;
import sonia.scm.repository.Repository; import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryRequestListenerUtil;
import sonia.scm.repository.RepositoryProvider; import sonia.scm.repository.RepositoryProvider;
import sonia.scm.repository.RepositoryRequestListenerUtil;
import sonia.scm.repository.SvnRepositoryHandler; import sonia.scm.repository.SvnRepositoryHandler;
import sonia.scm.util.AssertUtil; import sonia.scm.util.AssertUtil;
import sonia.scm.util.HttpUtil; import sonia.scm.util.HttpUtil;
@@ -68,6 +68,9 @@ import javax.servlet.http.HttpServletResponse;
public class SvnDAVServlet extends DAVServlet public class SvnDAVServlet extends DAVServlet
{ {
/** Field description */
private static final String HEADER_CONTEXTPATH = "X-Forwarded-Ctx";
/** Field description */ /** Field description */
private static final long serialVersionUID = -1462257085465785945L; private static final long serialVersionUID = -1462257085465785945L;
@@ -86,10 +89,9 @@ public class SvnDAVServlet extends DAVServlet
* @param repositoryRequestListenerUtil * @param repositoryRequestListenerUtil
*/ */
@Inject @Inject
public SvnDAVServlet( public SvnDAVServlet(SvnRepositoryHandler handler,
SvnRepositoryHandler handler, RepositoryProvider repositoryProvider,
RepositoryProvider repositoryProvider, RepositoryRequestListenerUtil repositoryRequestListenerUtil)
RepositoryRequestListenerUtil repositoryRequestListenerUtil)
{ {
this.handler = handler; this.handler = handler;
this.repositoryProvider = repositoryProvider; this.repositoryProvider = repositoryProvider;
@@ -110,17 +112,17 @@ public class SvnDAVServlet extends DAVServlet
*/ */
@Override @Override
public void service(HttpServletRequest request, HttpServletResponse response) public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException throws ServletException, IOException
{ {
Repository repository = repositoryProvider.get(); Repository repository = repositoryProvider.get();
if (repository != null) if (repository != null)
{ {
if (repositoryRequestListenerUtil.callListeners(request, response, if (repositoryRequestListenerUtil.callListeners(request, response,
repository)) repository))
{ {
super.service(new SvnHttpServletRequestWrapper(request, super.service(new SvnHttpServletRequestWrapper(request,
repositoryProvider), response); repositoryProvider), response);
} }
else if (logger.isDebugEnabled()) else if (logger.isDebugEnabled())
{ {
@@ -130,7 +132,7 @@ public class SvnDAVServlet extends DAVServlet
else else
{ {
super.service(new SvnHttpServletRequestWrapper(request, super.service(new SvnHttpServletRequestWrapper(request,
repositoryProvider), response); repositoryProvider), response);
} }
} }
@@ -158,7 +160,7 @@ public class SvnDAVServlet extends DAVServlet
* @author Enter your name here... * @author Enter your name here...
*/ */
private static class SvnHttpServletRequestWrapper private static class SvnHttpServletRequestWrapper
extends HttpServletRequestWrapper extends HttpServletRequestWrapper
{ {
/** /**
@@ -169,7 +171,7 @@ public class SvnDAVServlet extends DAVServlet
* @param repositoryProvider * @param repositoryProvider
*/ */
public SvnHttpServletRequestWrapper(HttpServletRequest request, public SvnHttpServletRequestWrapper(HttpServletRequest request,
RepositoryProvider repositoryProvider) RepositoryProvider repositoryProvider)
{ {
super(request); super(request);
this.repositoryProvider = repositoryProvider; this.repositoryProvider = repositoryProvider;
@@ -177,6 +179,25 @@ public class SvnDAVServlet extends DAVServlet
//~--- get methods -------------------------------------------------------- //~--- get methods --------------------------------------------------------
/**
* Method description
*
*
* @return
*/
@Override
public String getContextPath()
{
String header = getHeader(HEADER_CONTEXTPATH);
if ((header == null) ||!isValidContextPath(header))
{
header = super.getContextPath();
}
return header;
}
/** /**
* Method description * Method description
* *
@@ -230,6 +251,32 @@ public class SvnDAVServlet extends DAVServlet
return servletPath; return servletPath;
} }
/**
* Method description
*
*
* @param ctx
*
* @return
*/
private boolean isValidContextPath(String ctx)
{
int length = ctx.length();
boolean result = (length == 0)
|| ((length > 1)
&& ctx.startsWith(HttpUtil.SEPARATOR_PATH));
if (!result)
{
logger.warn(
"header {} contains a non valid context path, fallback to default",
HEADER_CONTEXTPATH);
}
return result;
}
//~--- fields ------------------------------------------------------------- //~--- fields -------------------------------------------------------------
/** Field description */ /** Field description */