mirror of
https://github.com/spring-projects/spring-boot.git
synced 2024-09-03 04:26:12 +08:00
Merge branch '3.1.x'
Closes gh-38353
This commit is contained in:
commit
ed7cf1043e
@ -48,3 +48,7 @@ The configuration differs, depending on the web server in use.
|
||||
For Tomcat, you can add the following configuration:
|
||||
|
||||
include::code:MyCloudFoundryConfiguration[]
|
||||
|
||||
If you're using a Webflux based application, you can use the following configuration:
|
||||
|
||||
include::code:MyReactiveCloudFoundryConfiguration[]
|
||||
|
@ -0,0 +1,69 @@
|
||||
/*
|
||||
* Copyright 2012-2023 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
|
||||
*
|
||||
* https://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.docs.actuator.cloudfoundry.customcontextpath;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import org.springframework.boot.autoconfigure.web.reactive.WebFluxProperties;
|
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.http.server.reactive.ContextPathCompositeHandler;
|
||||
import org.springframework.http.server.reactive.HttpHandler;
|
||||
import org.springframework.http.server.reactive.ServerHttpRequest;
|
||||
import org.springframework.http.server.reactive.ServerHttpResponse;
|
||||
import org.springframework.web.server.adapter.WebHttpHandlerBuilder;
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@EnableConfigurationProperties(WebFluxProperties.class)
|
||||
public class MyReactiveCloudFoundryConfiguration {
|
||||
|
||||
@Bean
|
||||
public HttpHandler httpHandler(ApplicationContext applicationContext, WebFluxProperties properties) {
|
||||
HttpHandler httpHandler = WebHttpHandlerBuilder.applicationContext(applicationContext).build();
|
||||
return new CloudFoundryHttpHandler(properties.getBasePath(), httpHandler);
|
||||
}
|
||||
|
||||
private static final class CloudFoundryHttpHandler implements HttpHandler {
|
||||
|
||||
private final HttpHandler delegate;
|
||||
|
||||
private final ContextPathCompositeHandler contextPathDelegate;
|
||||
|
||||
private CloudFoundryHttpHandler(String basePath, HttpHandler delegate) {
|
||||
this.delegate = delegate;
|
||||
this.contextPathDelegate = new ContextPathCompositeHandler(Map.of(basePath, delegate));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Void> handle(ServerHttpRequest request, ServerHttpResponse response) {
|
||||
// Remove underlying context path first (e.g. Servlet container)
|
||||
String path = request.getPath().pathWithinApplication().value();
|
||||
if (path.startsWith("/cloudfoundryapplication")) {
|
||||
return this.delegate.handle(request, response);
|
||||
}
|
||||
else {
|
||||
return this.contextPathDelegate.handle(request, response);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright 2012-2023 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
|
||||
*
|
||||
* https://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.docs.actuator.cloudfoundry.customcontextpath
|
||||
|
||||
import org.springframework.boot.autoconfigure.web.reactive.WebFluxProperties
|
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties
|
||||
import org.springframework.context.ApplicationContext
|
||||
import org.springframework.context.annotation.Bean
|
||||
import org.springframework.context.annotation.Configuration
|
||||
import org.springframework.http.server.reactive.ContextPathCompositeHandler
|
||||
import org.springframework.http.server.reactive.HttpHandler
|
||||
import org.springframework.http.server.reactive.ServerHttpRequest
|
||||
import org.springframework.http.server.reactive.ServerHttpResponse
|
||||
import org.springframework.web.server.adapter.WebHttpHandlerBuilder
|
||||
import reactor.core.publisher.Mono
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@EnableConfigurationProperties(WebFluxProperties::class)
|
||||
class MyReactiveCloudFoundryConfiguration {
|
||||
|
||||
@Bean
|
||||
fun httpHandler(applicationContext: ApplicationContext, properties: WebFluxProperties): HttpHandler {
|
||||
val httpHandler = WebHttpHandlerBuilder.applicationContext(applicationContext).build()
|
||||
return CloudFoundryHttpHandler(properties.basePath, httpHandler)
|
||||
}
|
||||
|
||||
private class CloudFoundryHttpHandler(basePath: String, private val delegate: HttpHandler) : HttpHandler {
|
||||
private val contextPathDelegate = ContextPathCompositeHandler(mapOf(basePath to delegate))
|
||||
|
||||
override fun handle(request: ServerHttpRequest, response: ServerHttpResponse): Mono<Void> {
|
||||
// Remove underlying context path first (e.g. Servlet container)
|
||||
val path = request.path.pathWithinApplication().value()
|
||||
return if (path.startsWith("/cloudfoundryapplication")) {
|
||||
delegate.handle(request, response)
|
||||
} else {
|
||||
contextPathDelegate.handle(request, response)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user