From 1f6f0dc101fb425bd63786ef669b0626a6591543 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Mon, 10 Oct 2016 17:39:54 -0400 Subject: [PATCH] Add getHandler in reactive AbstractHandlerMapping --- .../config/WebReactiveConfiguration.java | 2 +- .../handler/AbstractHandlerMapping.java | 38 ++++++++++++++----- .../handler/AbstractUrlHandlerMapping.java | 3 +- .../method/AbstractHandlerMethodMapping.java | 4 +- 4 files changed, 32 insertions(+), 15 deletions(-) diff --git a/spring-web-reactive/src/main/java/org/springframework/web/reactive/config/WebReactiveConfiguration.java b/spring-web-reactive/src/main/java/org/springframework/web/reactive/config/WebReactiveConfiguration.java index a67215de55..a78a7d6c8d 100644 --- a/spring-web-reactive/src/main/java/org/springframework/web/reactive/config/WebReactiveConfiguration.java +++ b/spring-web-reactive/src/main/java/org/springframework/web/reactive/config/WebReactiveConfiguration.java @@ -469,7 +469,7 @@ public class WebReactiveConfiguration implements ApplicationContextAware { private static final class EmptyHandlerMapping extends AbstractHandlerMapping { @Override - public Mono getHandler(ServerWebExchange exchange) { + public Mono getHandlerInternal(ServerWebExchange exchange) { return Mono.empty(); } } diff --git a/spring-web-reactive/src/main/java/org/springframework/web/reactive/handler/AbstractHandlerMapping.java b/spring-web-reactive/src/main/java/org/springframework/web/reactive/handler/AbstractHandlerMapping.java index 680d20a48f..b7423f5136 100644 --- a/spring-web-reactive/src/main/java/org/springframework/web/reactive/handler/AbstractHandlerMapping.java +++ b/spring-web-reactive/src/main/java/org/springframework/web/reactive/handler/AbstractHandlerMapping.java @@ -150,20 +150,38 @@ public abstract class AbstractHandlerMapping extends ApplicationObjectSupport } - protected Object processCorsRequest(ServerWebExchange exchange, Object handler) { - if (CorsUtils.isCorsRequest(exchange.getRequest())) { - CorsConfiguration configA = this.globalCorsConfigSource.getCorsConfiguration(exchange); - CorsConfiguration configB = getCorsConfiguration(handler, exchange); - CorsConfiguration config = (configA != null ? configA.combine(configB) : configB); + @Override + public Mono getHandler(ServerWebExchange exchange) { + return getHandlerInternal(exchange).map(handler -> { + if (CorsUtils.isCorsRequest(exchange.getRequest())) { + CorsConfiguration configA = this.globalCorsConfigSource.getCorsConfiguration(exchange); + CorsConfiguration configB = getCorsConfiguration(handler, exchange); + CorsConfiguration config = (configA != null ? configA.combine(configB) : configB); - if (!getCorsProcessor().processRequest(config, exchange) || - CorsUtils.isPreFlightRequest(exchange.getRequest())) { - return REQUEST_HANDLED_HANDLER; + if (!getCorsProcessor().processRequest(config, exchange) || + CorsUtils.isPreFlightRequest(exchange.getRequest())) { + return REQUEST_HANDLED_HANDLER; + } } - } - return handler; + return handler; + }); } + /** + * Look up a handler for the given request, returning an empty {@code Mono} + * if no specific one is found. This method is called by {@link #getHandler}. + * + *

On CORS pre-flight requests this method should return a match not for + * the pre-flight request but for the expected actual request based on the URL + * path, the HTTP methods from the "Access-Control-Request-Method" header, and + * the headers from the "Access-Control-Request-Headers" header thus allowing + * the CORS configuration to be obtained via {@link #getCorsConfigurations}, + * + * @param exchange current exchange + * @return {@code Mono} for the matching handler, if any + */ + protected abstract Mono getHandlerInternal(ServerWebExchange exchange); + /** * Retrieve the CORS configuration for the given handler. * @param handler the handler to check (never {@code null}). diff --git a/spring-web-reactive/src/main/java/org/springframework/web/reactive/handler/AbstractUrlHandlerMapping.java b/spring-web-reactive/src/main/java/org/springframework/web/reactive/handler/AbstractUrlHandlerMapping.java index f4ec65af55..a937fb8a7b 100644 --- a/spring-web-reactive/src/main/java/org/springframework/web/reactive/handler/AbstractUrlHandlerMapping.java +++ b/spring-web-reactive/src/main/java/org/springframework/web/reactive/handler/AbstractUrlHandlerMapping.java @@ -96,12 +96,11 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping { @Override - public Mono getHandler(ServerWebExchange exchange) { + public Mono getHandlerInternal(ServerWebExchange exchange) { String lookupPath = getPathHelper().getLookupPathForRequest(exchange); Object handler; try { handler = lookupHandler(lookupPath, exchange); - handler = processCorsRequest(exchange, handler); } catch (Exception ex) { return Mono.error(ex); diff --git a/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/AbstractHandlerMethodMapping.java b/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/AbstractHandlerMethodMapping.java index 312b7d69ac..f76cbf88be 100644 --- a/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/AbstractHandlerMethodMapping.java +++ b/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/AbstractHandlerMethodMapping.java @@ -254,7 +254,7 @@ public abstract class AbstractHandlerMethodMapping extends AbstractHandlerMap * @param exchange the current exchange */ @Override - public Mono getHandler(ServerWebExchange exchange) { + public Mono getHandlerInternal(ServerWebExchange exchange) { String lookupPath = getPathHelper().getLookupPathForRequest(exchange); if (logger.isDebugEnabled()) { logger.debug("Looking up handler method for path " + lookupPath); @@ -279,7 +279,7 @@ public abstract class AbstractHandlerMethodMapping extends AbstractHandlerMap if (handlerMethod != null) { handlerMethod = handlerMethod.createWithResolvedBean(); } - return Mono.justOrEmpty(processCorsRequest(exchange, handlerMethod)); + return Mono.justOrEmpty(handlerMethod); } finally { this.mappingRegistry.releaseReadLock();