Allow empty path in MockMvc

Closes gh-28823
This commit is contained in:
rstoyanchev 2022-07-14 12:50:32 +01:00
parent 963fd75aff
commit bf63309d05
3 changed files with 30 additions and 5 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2021 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.
@ -148,7 +148,7 @@ public class MockHttpServletRequestBuilder
private static URI initUri(String url, Object[] vars) {
Assert.notNull(url, "'url' must not be null");
Assert.isTrue(url.startsWith("/") || url.startsWith("http://") || url.startsWith("https://"), "" +
Assert.isTrue(url.isEmpty() || url.startsWith("/") || url.startsWith("http://") || url.startsWith("https://"),
"'url' should start with a path or be a complete HTTP URL: " + url);
return UriComponentsBuilder.fromUriString(url).buildAndExpand(vars).encode().toUri();
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2020 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.
@ -50,6 +50,15 @@ public class DefaultControllerSpecTests {
.expectBody(String.class).isEqualTo("Success");
}
@Test
public void controllerEmptyPath() {
new DefaultControllerSpec(new MyController()).build()
.get().uri("")
.exchange()
.expectStatus().isOk()
.expectBody(String.class).isEqualTo("Success empty path");
}
@Test
public void controllerAdvice() {
new DefaultControllerSpec(new MyController())
@ -116,10 +125,15 @@ public class DefaultControllerSpecTests {
private static class MyController {
@GetMapping("/")
public String handle() {
public String handleRootPath() {
return "Success";
}
@GetMapping
public String handleEmptyPath() {
return "Success empty path";
}
@GetMapping("/exception")
public void handleWithError() {
throw new IllegalStateException();

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2021 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.
@ -165,6 +165,17 @@ class MockHttpServletRequestBuilderTests {
assertThat(request.getPathInfo()).isNull();
}
@Test // gh-28823
void emptyPath() {
this.builder = new MockHttpServletRequestBuilder(HttpMethod.GET, "");
MockHttpServletRequest request = this.builder.buildRequest(this.servletContext);
assertThat(request.getRequestURI()).isEqualTo("");
assertThat(request.getContextPath()).isEqualTo("");
assertThat(request.getServletPath()).isEqualTo("");
assertThat(request.getPathInfo()).isNull();
}
@Test // SPR-16453
void pathInfoIsDecoded() {
this.builder = new MockHttpServletRequestBuilder(HttpMethod.GET, "/travel/hotels 42");