Skip to content

Commit

Permalink
[UNDERTOW-2094] fix relative redirect with trailing slash context
Browse files Browse the repository at this point in the history
  • Loading branch information
aogburn authored and fl4via committed Jun 14, 2022
1 parent c880d96 commit 96a39ff
Show file tree
Hide file tree
Showing 3 changed files with 140 additions and 0 deletions.
Expand Up @@ -194,6 +194,8 @@ public void sendRedirect(final String location) throws IOException {
int lastSlash = current.lastIndexOf("/");
if (lastSlash != -1) {
current = current.substring(0, lastSlash + 1);
} else {
current = "";
}
realPath = CanonicalPathUtils.canonicalize(servletContext.getContextPath() + current + location);
}
Expand Down
@@ -0,0 +1,44 @@
/*
* JBoss, Home of Professional Open Source.
* Copyright 2022 Red Hat, Inc., and individual contributors
* as indicated by the @author tags.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.undertow.servlet.test.redirect;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
*
* @author baranowb
* @author Emond Papegaaij
* @author aogburn
*
*/
public class RelativeRedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(req.getRequestURI());
if (req.getRequestURI().contains("test")) {
resp.getWriter().write(req.getRequestURI());
} else {
resp.sendRedirect(resp.encodeRedirectURL("test"));
}
}
}
@@ -0,0 +1,94 @@
/*
* JBoss, Home of Professional Open Source.
* Copyright 2022 Red Hat, Inc., and individual contributors
* as indicated by the @author tags.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.undertow.servlet.test.redirect;

import static io.undertow.servlet.Servlets.servlet;

import javax.servlet.ServletException;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;

import io.undertow.server.handlers.PathHandler;
import io.undertow.servlet.api.DeploymentInfo;
import io.undertow.servlet.api.DeploymentManager;
import io.undertow.servlet.api.ServletContainer;
import io.undertow.servlet.test.util.TestClassIntrospector;
import io.undertow.testutils.DefaultServer;
import io.undertow.testutils.HttpClientUtils;
import io.undertow.testutils.TestHttpClient;
import io.undertow.util.StatusCodes;

/**
* Test relative redirection when app has a context path with a trailing slash
* @author baranowb
* @author aogburn
*
*/
@RunWith(DefaultServer.class)
public class RelativeRedirectServletTestCase {
@BeforeClass
public static void setup() throws ServletException {


final PathHandler pathHandler = new PathHandler();
final ServletContainer container = ServletContainer.Factory.newInstance();
DeploymentInfo builder = new DeploymentInfo()
.setClassLoader(RedirectEncodedToSubPathTestCase.class.getClassLoader())
.setContextPath("/servletContext/")
.setClassIntrospecter(TestClassIntrospector.INSTANCE)
.setDeploymentName("servletContext.war")
.addServlets(
servlet("redirect", RelativeRedirectServlet.class)
.addMapping("/*"));
DeploymentManager manager = container.addDeployment(builder);
manager.deploy();
try {
pathHandler.addPrefixPath(builder.getContextPath(), manager.start());
} catch (ServletException e) {
throw new RuntimeException(e);
}
DefaultServer.setRootHandler(pathHandler);

}

@Test
public void testServletRedirect() throws Exception {
//test redirects
runtest("/servletContext/foobar", "/servletContext/test");
}

private void runtest(String request, String expectedBody) throws Exception {
TestHttpClient client = new TestHttpClient();
try {
HttpGet get = new HttpGet(DefaultServer.getDefaultServerURL() + request);
HttpResponse result = client.execute(get);
Assert.assertEquals(StatusCodes.OK, result.getStatusLine().getStatusCode());
final String response = HttpClientUtils.readResponse(result);

Assert.assertEquals(expectedBody, response);
} finally {
client.getConnectionManager().shutdown();
}
}

}

0 comments on commit 96a39ff

Please sign in to comment.