Skip to content

Commit 1f78ced

Browse files
committed
Merge branch '5.2.x'
2 parents eeb6c10 + c4326cb commit 1f78ced

File tree

2 files changed

+31
-1
lines changed

2 files changed

+31
-1
lines changed

spring-web/src/main/java/org/springframework/http/server/reactive/DefaultServerHttpRequestBuilder.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ public DefaultServerHttpRequestBuilder(ServerHttpRequest original) {
7171
this.uri = original.getURI();
7272
this.headers = HttpHeaders.writableHttpHeaders(original.getHeaders());
7373
this.httpMethodValue = original.getMethodValue();
74+
this.contextPath = original.getPath().contextPath().value();
7475
this.remoteAddress = original.getRemoteAddress();
7576
this.body = original.getBody();
7677
this.originalRequest = original;

spring-web/src/test/java/org/springframework/http/server/reactive/ServerHttpRequestTests.java

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737

3838
import static org.assertj.core.api.Assertions.assertThat;
3939
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
40+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
4041
import static org.mockito.Mockito.mock;
4142

4243
/**
@@ -164,14 +165,42 @@ public void mutateHeaderBySettingHeaderValues() throws Exception {
164165
assertThat(request.getHeaders().get(headerName)).containsExactly(headerValue3);
165166
}
166167

168+
@Test
169+
void mutateWithExistingContextPath() throws Exception {
170+
ServerHttpRequest request = createRequest("/context/path", "/context");
171+
172+
ServerHttpRequest mutated = request.mutate().build();
173+
assertThat(mutated.getPath().contextPath().value()).isEqualTo("/context");
174+
assertThat(mutated.getPath().pathWithinApplication().value()).isEqualTo("/path");
175+
assertThat(mutated.getURI().getRawPath()).isEqualTo("/context/path");
176+
177+
mutated = request.mutate().contextPath("/other").path("/other/path").build();
178+
assertThat(mutated.getPath().contextPath().value()).isEqualTo("/other");
179+
assertThat(mutated.getPath().pathWithinApplication().value()).isEqualTo("/path");
180+
assertThat(mutated.getURI().getRawPath()).isEqualTo("/other/path");
181+
}
182+
183+
@Test
184+
void mutateContextPathWithoutUpdatingPathShouldFail() throws Exception {
185+
ServerHttpRequest request = createRequest("/context/path", "/context");
186+
187+
assertThatThrownBy(() -> request.mutate().path("/fail").build())
188+
.isInstanceOf(IllegalArgumentException.class)
189+
.hasMessage("Invalid contextPath '/context': must match the start of requestPath: '/fail'");
190+
}
191+
167192
private ServerHttpRequest createRequest(String uriString) throws Exception {
193+
return createRequest(uriString, "");
194+
}
195+
196+
private ServerHttpRequest createRequest(String uriString, String contextPath) throws Exception {
168197
URI uri = URI.create(uriString);
169198
MockHttpServletRequest request = new TestHttpServletRequest(uri);
199+
request.setContextPath(contextPath);
170200
AsyncContext asyncContext = new MockAsyncContext(request, new MockHttpServletResponse());
171201
return new ServletServerHttpRequest(request, asyncContext, "", new DefaultDataBufferFactory(), 1024);
172202
}
173203

174-
175204
private static class TestHttpServletRequest extends MockHttpServletRequest {
176205

177206
TestHttpServletRequest(URI uri) {

0 commit comments

Comments
 (0)