diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/ForwardRequestPostProcessor.java b/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/ForwardRequestPostProcessor.java index 1fcc6357155..2640bf65926 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/ForwardRequestPostProcessor.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/ForwardRequestPostProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,28 +19,42 @@ package org.springframework.test.web.servlet.htmlunit; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.test.web.servlet.request.RequestPostProcessor; import org.springframework.util.Assert; +import org.springframework.util.StringUtils; /** - * {@link RequestPostProcessor} for forward requests. + * {@link RequestPostProcessor} to update the request for a forwarded dispatch. * * @author Rob Winch * @author Sam Brannen + * @author Rossen Stoyanchev * @since 4.2 */ final class ForwardRequestPostProcessor implements RequestPostProcessor { - private final String forwardUrl; + private final String forwardedUrl; - public ForwardRequestPostProcessor(String forwardUrl) { - Assert.hasText(forwardUrl, "Forward URL must not be null or empty"); - this.forwardUrl = forwardUrl; + public ForwardRequestPostProcessor(String forwardedUrl) { + Assert.hasText(forwardedUrl, "Forwarded URL must not be null or empty"); + this.forwardedUrl = forwardedUrl; } @Override public MockHttpServletRequest postProcessRequest(MockHttpServletRequest request) { - request.setServletPath(this.forwardUrl); + request.setRequestURI(this.forwardedUrl); + request.setServletPath(initServletPath(request.getContextPath())); return request; } + private String initServletPath(String contextPath) { + if (StringUtils.hasText(contextPath)) { + Assert.state(this.forwardedUrl.startsWith(contextPath), "Forward supported to same contextPath only"); + return (this.forwardedUrl.length() > contextPath.length() ? + this.forwardedUrl.substring(contextPath.length()) : ""); + } + else { + return this.forwardedUrl; + } + } + }