Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
With mapperContextRootRedirectEnabled ste to false, the redirect needs to be handled elsewhere.
- Ensure the Mapper does not add the '/' handling the redirect
- Handle the redirect in the DefaultServlet
- Add a redirect to FORM auth if auth is occurring at the context root else the login page could be submitted to the wrong web application

git-svn-id: https://svn.apache.org/repos/asf/tomcat/tc7.0.x/trunk@1717212 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information
markt-asf committed Nov 30, 2015
1 parent fb08113 commit 7288bc7
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 20 deletions.
14 changes: 14 additions & 0 deletions java/org/apache/catalina/authenticator/FormAuthenticator.java
Expand Up @@ -236,6 +236,20 @@ public boolean authenticate(Request request,

// No -- Save this request and redirect to the form login page
if (!loginAction) {
// If this request was to the root of the context without a trailing
// '/', need to redirect to add it else the submit of the login form
// may not go to the correct web application
if (request.getServletPath().length() == 0 && request.getPathInfo() == null) {
StringBuilder location = new StringBuilder(requestURI);
location.append('/');
if (request.getQueryString() != null) {
location.append('?');
location.append(request.getQueryString());
}
response.sendRedirect(response.encodeRedirectURL(location.toString()));
return false;
}

session = request.getSessionInternal(true);
if (log.isDebugEnabled()) {
log.debug("Save request in session '" + session.getIdInternal() + "'");
Expand Down
33 changes: 24 additions & 9 deletions java/org/apache/catalina/servlets/DefaultServlet.java
Expand Up @@ -375,6 +375,10 @@ public void init() throws ServletException {
* @param request The servlet request we are processing
*/
protected String getRelativePath(HttpServletRequest request) {
return getRelativePath(request, false);
}

protected String getRelativePath(HttpServletRequest request, boolean allowEmptyPath) {
// IMPORTANT: DefaultServlet can be mapped to '/' or '/path/*' but always
// serves resources from the web app root with context rooted paths.
// i.e. it can not be used to mount the web app root under a sub-path
Expand All @@ -400,7 +404,7 @@ protected String getRelativePath(HttpServletRequest request) {
if (pathInfo != null) {
result.append(pathInfo);
}
if (result.length() == 0) {
if (result.length() == 0 && !allowEmptyPath) {
result.append('/');
}

Expand Down Expand Up @@ -778,7 +782,8 @@ protected void serveResource(HttpServletRequest request,
boolean serveContent = content;

// Identify the requested resource path
String path = getRelativePath(request);
String path = getRelativePath(request, true);

if (debug > 0) {
if (serveContent)
log("DefaultServlet.serveResource: Serving resource '" +
Expand All @@ -788,6 +793,12 @@ protected void serveResource(HttpServletRequest request,
path + "' headers only");
}

if (path.length() == 0) {
// Context root redirect
doDirectoryRedirect(request, response);
return;
}

CacheEntry cacheEntry = resources.lookupCache(path);

if (!cacheEntry.exists) {
Expand Down Expand Up @@ -857,13 +868,7 @@ protected void serveResource(HttpServletRequest request,
if (cacheEntry.context != null) {

if (!path.endsWith("/")) {
StringBuilder location = new StringBuilder(request.getRequestURI());
location.append('/');
if (request.getQueryString() != null) {
location.append('?');
location.append(request.getQueryString());
}
response.sendRedirect(response.encodeRedirectURL(location.toString()));
doDirectoryRedirect(request, response);
return;
}

Expand Down Expand Up @@ -1074,6 +1079,16 @@ protected void serveResource(HttpServletRequest request,

}

private void doDirectoryRedirect(HttpServletRequest request, HttpServletResponse response)
throws IOException {
StringBuilder location = new StringBuilder(request.getRequestURI());
location.append('/');
if (request.getQueryString() != null) {
location.append('?');
location.append(request.getQueryString());
}
response.sendRedirect(response.encodeRedirectURL(location.toString()));
}

/**
* Parse the content-range header.
Expand Down
5 changes: 5 additions & 0 deletions java/org/apache/catalina/servlets/WebdavServlet.java
Expand Up @@ -430,6 +430,11 @@ protected boolean checkIfHeaders(HttpServletRequest request,
*/
@Override
protected String getRelativePath(HttpServletRequest request) {
return getRelativePath(request, false);
}

@Override
protected String getRelativePath(HttpServletRequest request, boolean allowEmptyPath) {
String pathInfo;

if (request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI) != null) {
Expand Down
21 changes: 10 additions & 11 deletions java/org/apache/tomcat/util/http/mapper/Mapper.java
Expand Up @@ -887,20 +887,13 @@ private final void internalMapWrapper(ContextVersion contextVersion,

int pathOffset = path.getOffset();
int pathEnd = path.getEnd();
int servletPath = pathOffset;
boolean noServletPath = false;

int length = contextVersion.path.length();
if (length != (pathEnd - pathOffset)) {
servletPath = pathOffset + length;
} else {
if (length == (pathEnd - pathOffset)) {
noServletPath = true;
path.append('/');
pathOffset = path.getOffset();
pathEnd = path.getEnd();
servletPath = pathOffset+length;
}

int servletPath = pathOffset + length;
path.setOffset(servletPath);

// Rule 1 -- Exact Match
Expand Down Expand Up @@ -938,8 +931,10 @@ private final void internalMapWrapper(ContextVersion contextVersion,
if(mappingData.wrapper == null && noServletPath &&
contextVersion.mapperContextRootRedirectEnabled) {
// The path is empty, redirect to "/"
path.append('/');
pathEnd = path.getEnd();
mappingData.redirectPath.setChars
(path.getBuffer(), pathOffset, pathEnd-pathOffset);
(path.getBuffer(), pathOffset, pathEnd - pathOffset);
path.setEnd(pathEnd - 1);
return;
}
Expand Down Expand Up @@ -1060,7 +1055,11 @@ private final void internalMapWrapper(ContextVersion contextVersion,
Object file = null;
String pathStr = path.toString();
try {
file = contextVersion.resources.lookup(pathStr);
if (pathStr.length() == 0) {
file = contextVersion.resources.lookup("/");
} else {
file = contextVersion.resources.lookup(pathStr);
}
} catch(NamingException nex) {
// Swallow, since someone else handles the 404
}
Expand Down
9 changes: 9 additions & 0 deletions webapps/docs/changelog.xml
Expand Up @@ -58,6 +58,15 @@
issues do not "pop up" wrt. others).
-->
<section name="Tomcat 7.0.67 (violetagg)">
<subsection name="Catalina">
<changelog>
<fix>
<bug>58660</bug>: Correct a regression in 8.0.29 caused by the change
that moved the redirection for context roots from the Mapper to the
Default Servlet. (markt)
</fix>
</changelog>
</subsection>
<subsection name="WebSocket">
<changelog>
<fix>
Expand Down

0 comments on commit 7288bc7

Please sign in to comment.