Honour endpoint.enabled:false for nested paths
Previously, only invocations of /metricName/ would honour the enabled property and return a not found (404) response. For endpoints which support nested paths, access to /metricName/foo would ignore the enabled flag and return an OK (200) response. Furthermore, there was a comment in EndpointMvcAdapter that suggested that an endpoint shouldn’t be called when it is disabled, however this was not the case. This commit updates EndpointWebMvcAutoConfiguration and JolokiaAutoConfiguration to only register their MvcEndpoint beans if the underlying endpoint is enabled. This means that an EndpointMvcAdapter should not be called if its delegate is disabled, making the comment described above accurate. The check for the delegate being enabled has been retained so as not to rely upon the auto-configurations’ behaviour. The methods which handle nested paths (MetricsMvcEndpoint.value() and EnvironmentMvcEndpoint.value()) have been updated to add the same check for the enablement of their delegate. Fixes gh-2767
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2014 the original author or authors.
|
||||
* Copyright 2012-2015 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.
|
||||
@@ -51,8 +51,8 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
|
||||
import org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration;
|
||||
@@ -84,6 +84,7 @@ import org.springframework.web.servlet.DispatcherServlet;
|
||||
* @author Dave Syer
|
||||
* @author Phillip Webb
|
||||
* @author Christian Dupuis
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
@Configuration
|
||||
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class })
|
||||
@@ -155,14 +156,14 @@ public class EndpointWebMvcAutoConfiguration implements ApplicationContextAware,
|
||||
|
||||
@Bean
|
||||
@ConditionalOnBean(EnvironmentEndpoint.class)
|
||||
@ConditionalOnProperty(prefix = "endpoints.env", name = "enabled", matchIfMissing = true)
|
||||
@ConditionalOnExpression("${endpoints.env.enabled:${endpoints.enabled:true}}")
|
||||
public EnvironmentMvcEndpoint environmentMvcEndpoint(EnvironmentEndpoint delegate) {
|
||||
return new EnvironmentMvcEndpoint(delegate);
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConditionalOnBean(HealthEndpoint.class)
|
||||
@ConditionalOnProperty(prefix = "endpoints.health", name = "enabled", matchIfMissing = true)
|
||||
@ConditionalOnExpression("${endpoints.health.enabled:${endpoints.enabled:true}}")
|
||||
public HealthMvcEndpoint healthMvcEndpoint(HealthEndpoint delegate) {
|
||||
Security security = this.managementServerProperties.getSecurity();
|
||||
boolean secure = (security == null || security.isEnabled());
|
||||
@@ -176,14 +177,14 @@ public class EndpointWebMvcAutoConfiguration implements ApplicationContextAware,
|
||||
|
||||
@Bean
|
||||
@ConditionalOnBean(MetricsEndpoint.class)
|
||||
@ConditionalOnProperty(prefix = "endpoints.metrics", name = "enabled", matchIfMissing = true)
|
||||
@ConditionalOnExpression("${endpoints.metrics.enabled:${endpoints.enabled:true}}")
|
||||
public MetricsMvcEndpoint metricsMvcEndpoint(MetricsEndpoint delegate) {
|
||||
return new MetricsMvcEndpoint(delegate);
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConditionalOnBean(ShutdownEndpoint.class)
|
||||
@ConditionalOnProperty(prefix = "endpoints.shutdown", name = "enabled", matchIfMissing = true)
|
||||
@ConditionalOnExpression("${endpoints.shutdown.enabled:false}")
|
||||
public ShutdownMvcEndpoint shutdownMvcEndpoint(ShutdownEndpoint delegate) {
|
||||
return new ShutdownMvcEndpoint(delegate);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2013-2014 the original author or authors.
|
||||
* Copyright 2013-2015 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.
|
||||
@@ -25,8 +25,8 @@ import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
|
||||
import org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration;
|
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||
@@ -39,8 +39,8 @@ import org.springframework.context.annotation.Configuration;
|
||||
*
|
||||
* <p>
|
||||
* This configuration will get automatically enabled as soon as the Jolokia
|
||||
* {@link AgentServlet} is on the classpath. To disable set
|
||||
* <code>endpoints.jolokia.enabled: false</code>.
|
||||
* {@link AgentServlet} is on the classpath. To disable it set
|
||||
* <code>endpoints.jolokia.enabled: false</code> or <code>endpoints.enabled: false</code>.
|
||||
*
|
||||
* <p>
|
||||
* Additional configuration parameters for Jolokia can be provided by specifying
|
||||
@@ -50,11 +50,12 @@ import org.springframework.context.annotation.Configuration;
|
||||
*
|
||||
* @author Christian Dupuis
|
||||
* @author Dave Syer
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
@Configuration
|
||||
@ConditionalOnWebApplication
|
||||
@ConditionalOnClass({ AgentServlet.class })
|
||||
@ConditionalOnProperty(prefix = "endpoints.jolokia", name = "enabled", matchIfMissing = true)
|
||||
@ConditionalOnExpression("${endpoints.jolokia.enabled:${endpoints.enabled:true}}")
|
||||
@AutoConfigureBefore(ManagementSecurityAutoConfiguration.class)
|
||||
@AutoConfigureAfter(EmbeddedServletContainerAutoConfiguration.class)
|
||||
@EnableConfigurationProperties(JolokiaProperties.class)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2014 the original author or authors.
|
||||
* Copyright 2012-2015 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.
|
||||
@@ -31,9 +31,14 @@ import org.springframework.web.bind.annotation.ResponseBody;
|
||||
* Adapter class to expose {@link Endpoint}s as {@link MvcEndpoint}s.
|
||||
*
|
||||
* @author Dave Syer
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
public class EndpointMvcAdapter implements MvcEndpoint {
|
||||
|
||||
private final ResponseEntity<Map<String, String>> disabledResponse = new ResponseEntity<Map<String, String>>(
|
||||
Collections.singletonMap("message", "This endpoint is disabled"),
|
||||
HttpStatus.NOT_FOUND);
|
||||
|
||||
private final Endpoint<?> delegate;
|
||||
|
||||
/**
|
||||
@@ -49,9 +54,9 @@ public class EndpointMvcAdapter implements MvcEndpoint {
|
||||
@ResponseBody
|
||||
public Object invoke() {
|
||||
if (!this.delegate.isEnabled()) {
|
||||
// Shouldn't happen
|
||||
return new ResponseEntity<Map<String, String>>(Collections.singletonMap(
|
||||
"message", "This endpoint is disabled"), HttpStatus.NOT_FOUND);
|
||||
// Shouldn't happen - MVC endpoint shouldn't be registered when delegate's
|
||||
// disabled
|
||||
return this.disabledResponse;
|
||||
}
|
||||
return this.delegate.invoke();
|
||||
}
|
||||
@@ -76,4 +81,15 @@ public class EndpointMvcAdapter implements MvcEndpoint {
|
||||
return this.delegate.getClass();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the response that should be returned when the endpoint is disabled.
|
||||
*
|
||||
* @see Endpoint#isEnabled()
|
||||
* @since 1.2.4
|
||||
* @return The response to be returned when the endpoint is disabled
|
||||
*/
|
||||
protected ResponseEntity<?> getDisabledResponse() {
|
||||
return this.disabledResponse;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2014 the original author or authors.
|
||||
* Copyright 2012-2015 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.
|
||||
@@ -31,6 +31,7 @@ import org.springframework.web.bind.annotation.ResponseStatus;
|
||||
*
|
||||
* @author Dave Syer
|
||||
* @author Christian Dupuis
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
public class EnvironmentMvcEndpoint extends EndpointMvcAdapter implements
|
||||
EnvironmentAware {
|
||||
@@ -44,6 +45,11 @@ public class EnvironmentMvcEndpoint extends EndpointMvcAdapter implements
|
||||
@RequestMapping(value = "/{name:.*}", method = RequestMethod.GET)
|
||||
@ResponseBody
|
||||
public Object value(@PathVariable String name) {
|
||||
if (!getDelegate().isEnabled()) {
|
||||
// Shouldn't happen - MVC endpoint shouldn't be registered when delegate's
|
||||
// disabled
|
||||
return getDisabledResponse();
|
||||
}
|
||||
String result = this.environment.getProperty(name);
|
||||
if (result == null) {
|
||||
throw new NoSuchPropertyException("No such property: " + name);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2014 the original author or authors.
|
||||
* Copyright 2012-2015 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.
|
||||
@@ -28,6 +28,7 @@ import org.springframework.web.bind.annotation.ResponseStatus;
|
||||
* Adapter to expose {@link MetricsEndpoint} as an {@link MvcEndpoint}.
|
||||
*
|
||||
* @author Dave Syer
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
public class MetricsMvcEndpoint extends EndpointMvcAdapter {
|
||||
|
||||
@@ -41,6 +42,11 @@ public class MetricsMvcEndpoint extends EndpointMvcAdapter {
|
||||
@RequestMapping(value = "/{name:.*}", method = RequestMethod.GET)
|
||||
@ResponseBody
|
||||
public Object value(@PathVariable String name) {
|
||||
if (!this.delegate.isEnabled()) {
|
||||
// Shouldn't happen - MVC endpoint shouldn't be registered when delegate's
|
||||
// disabled
|
||||
return getDisabledResponse();
|
||||
}
|
||||
Object value = this.delegate.invoke().get(name);
|
||||
if (value == null) {
|
||||
throw new NoSuchMetricException("No such metric: " + name);
|
||||
|
||||
Reference in New Issue
Block a user