Browse Source
This commit removes the restriction that was added in 4a61e45 to
prevent / from being used as the management context path when the
management context was not using a different port
The management context path can now be set to / irrespective of the
configuration of the management port. To avoid a possible clash
with the application's welcome page or similar, the links "endpoint"
that is mapping to the management context path is disabled when
the management context path is /.
As part of allowing / to be used as the management context path again,
the handling of endpoint mappings and the creation of paths for
individual operations has been consolidated into a new EndpointMapping
class that is used across the three (MVC, WebFlux, and Jersey)
implementations.
See gh-9898
pull/10277/head
18 changed files with 291 additions and 65 deletions
@ -0,0 +1,66 @@
@@ -0,0 +1,66 @@
|
||||
/* |
||||
* Copyright 2012-2017 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. |
||||
* 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 org.springframework.boot.endpoint.web; |
||||
|
||||
import org.springframework.util.StringUtils; |
||||
|
||||
/** |
||||
* A value object for the base mapping for endpoints. |
||||
* |
||||
* @author Andy Wilkinson |
||||
* @since 2.0.0 |
||||
*/ |
||||
public class EndpointMapping { |
||||
|
||||
private final String path; |
||||
|
||||
/** |
||||
* Creates a new {@code EndpointMapping} using the given {@code path}. |
||||
* |
||||
* @param path the path |
||||
*/ |
||||
public EndpointMapping(String path) { |
||||
this.path = normalizePath(path); |
||||
} |
||||
|
||||
private static String normalizePath(String path) { |
||||
if (!StringUtils.hasText(path)) { |
||||
return path; |
||||
} |
||||
String normalizedPath = path; |
||||
if (!normalizedPath.startsWith("/")) { |
||||
normalizedPath = "/" + normalizedPath; |
||||
} |
||||
if (normalizedPath.endsWith("/")) { |
||||
normalizedPath = normalizedPath.substring(0, normalizedPath.length() - 1); |
||||
} |
||||
return normalizedPath; |
||||
} |
||||
|
||||
/** |
||||
* Returns the path to which endpoints should be mapped. |
||||
* @return the path |
||||
*/ |
||||
public String getPath() { |
||||
return this.path; |
||||
} |
||||
|
||||
public String createSubPath(String path) { |
||||
return this.path + normalizePath(path); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,82 @@
@@ -0,0 +1,82 @@
|
||||
/* |
||||
* Copyright 2012-2017 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. |
||||
* 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 org.springframework.boot.endpoint.web; |
||||
|
||||
import org.junit.Test; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
|
||||
/** |
||||
* Tests for {@link EndpointMapping}. |
||||
* |
||||
* @author Andy Wilkinson |
||||
*/ |
||||
public class EndpointMappingTests { |
||||
|
||||
@Test |
||||
public void normalizationTurnsASlashIntoAnEmptyString() { |
||||
assertThat(new EndpointMapping("/").getPath()).isEqualTo(""); |
||||
} |
||||
|
||||
@Test |
||||
public void normalizationLeavesAnEmptyStringAsIs() { |
||||
assertThat(new EndpointMapping("").getPath()).isEqualTo(""); |
||||
} |
||||
|
||||
@Test |
||||
public void normalizationRemovesATrailingSlash() { |
||||
assertThat(new EndpointMapping("/test/").getPath()).isEqualTo("/test"); |
||||
} |
||||
|
||||
@Test |
||||
public void normalizationAddsALeadingSlash() { |
||||
assertThat(new EndpointMapping("test").getPath()).isEqualTo("/test"); |
||||
} |
||||
|
||||
@Test |
||||
public void normalizationAddsALeadingSlashAndRemovesATrailingSlash() { |
||||
assertThat(new EndpointMapping("test/").getPath()).isEqualTo("/test"); |
||||
} |
||||
|
||||
@Test |
||||
public void normalizationLeavesAPathWithALeadingSlashAndNoTrailingSlashAsIs() { |
||||
assertThat(new EndpointMapping("/test").getPath()).isEqualTo("/test"); |
||||
} |
||||
|
||||
@Test |
||||
public void subPathForAnEmptyStringReturnsBasePath() { |
||||
assertThat(new EndpointMapping("/test").createSubPath("")).isEqualTo("/test"); |
||||
} |
||||
|
||||
@Test |
||||
public void subPathWithALeadingSlashIsSeparatedFromBasePathBySingleSlash() { |
||||
assertThat(new EndpointMapping("/test").createSubPath("/one")) |
||||
.isEqualTo("/test/one"); |
||||
} |
||||
|
||||
@Test |
||||
public void subPathWithoutALeadingSlashIsSeparaedFromBasePathBySingleSlash() { |
||||
assertThat(new EndpointMapping("/test").createSubPath("one")).isEqualTo("/test/one"); |
||||
} |
||||
|
||||
@Test |
||||
public void trailingSlashIsRemovedFromASubPath() { |
||||
assertThat(new EndpointMapping("/test").createSubPath("one/")) |
||||
.isEqualTo("/test/one"); |
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue