diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/DispatcherHandler.java b/spring-webflux/src/main/java/org/springframework/web/reactive/DispatcherHandler.java index 754125719b5..57f5784f3ec 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/DispatcherHandler.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/DispatcherHandler.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 the original author or authors. + * Copyright 2002-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. @@ -120,7 +120,7 @@ public class DispatcherHandler implements WebHandler, ApplicationContextAware { public Mono handle(ServerWebExchange exchange) { if (logger.isDebugEnabled()) { ServerHttpRequest request = exchange.getRequest(); - logger.debug("Processing " + request.getMethod() + " request for [" + request.getURI() + "]"); + logger.debug("Processing " + request.getMethodValue() + " request for [" + request.getURI() + "]"); } return Flux.fromIterable(this.handlerMappings) .concatMap(mapping -> mapping.getHandler(exchange)) diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceWebHandler.java b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceWebHandler.java index 405d7f64b5c..db42c513e8b 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceWebHandler.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceWebHandler.java @@ -283,7 +283,7 @@ public class ResourceWebHandler })) .flatMap(resource -> { try { - if (HttpMethod.OPTIONS.equals(exchange.getRequest().getMethod())) { + if (HttpMethod.OPTIONS.matches(exchange.getRequest().getMethodValue())) { exchange.getResponse().getHeaders().add("Allow", "GET,HEAD,OPTIONS"); return Mono.empty(); } @@ -323,7 +323,7 @@ public class ResourceWebHandler } // Content phase - if (HttpMethod.HEAD.equals(exchange.getRequest().getMethod())) { + if (HttpMethod.HEAD.matches(exchange.getRequest().getMethodValue())) { setHeaders(exchange, resource, mediaType); exchange.getResponse().getHeaders().set(HttpHeaders.ACCEPT_RANGES, "bytes"); logger.trace("HEAD request - skipping content"); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/RequestMethodsRequestCondition.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/RequestMethodsRequestCondition.java index 14f96e740ba..65fdab0682e 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/RequestMethodsRequestCondition.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/RequestMethodsRequestCondition.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 the original author or authors. + * Copyright 2002-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. @@ -107,7 +107,7 @@ public final class RequestMethodsRequestCondition extends AbstractRequestConditi return matchPreFlight(exchange.getRequest()); } if (getMethods().isEmpty()) { - if (RequestMethod.OPTIONS.name().equals(exchange.getRequest().getMethod().name())) { + if (RequestMethod.OPTIONS.name().equals(exchange.getRequest().getMethodValue())) { return null; // No implicit match for OPTIONS (we handle it) } return this; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/RequestMappingInfoHandlerMapping.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/RequestMappingInfoHandlerMapping.java index 96b2ecfee8f..0e258ccaaa9 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/RequestMappingInfoHandlerMapping.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/RequestMappingInfoHandlerMapping.java @@ -218,9 +218,9 @@ public abstract class RequestMappingInfoHandlerMapping extends AbstractHandlerMe ServerHttpRequest request = exchange.getRequest(); if (helper.hasMethodsMismatch()) { - HttpMethod httpMethod = request.getMethod(); + String httpMethod = request.getMethodValue(); Set methods = helper.getAllowedMethods(); - if (HttpMethod.OPTIONS.matches(httpMethod.name())) { + if (HttpMethod.OPTIONS.matches(httpMethod)) { HttpOptionsHandler handler = new HttpOptionsHandler(methods); return new HandlerMethod(handler, HTTP_OPTIONS_HANDLE_METHOD); } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/InvalidHttpMethodIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/InvalidHttpMethodIntegrationTests.java new file mode 100644 index 00000000000..893e58e9ab4 --- /dev/null +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/InvalidHttpMethodIntegrationTests.java @@ -0,0 +1,52 @@ +/* + * Copyright 2002-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.web.reactive.function.server; + +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * @author Arjen Poutsma + */ +public class InvalidHttpMethodIntegrationTests extends AbstractRouterFunctionIntegrationTests { + + @Override + protected RouterFunction routerFunction() { + return RouterFunctions.route(RequestPredicates.GET("/"), + request -> ServerResponse.ok().syncBody("FOO")) + .andRoute(RequestPredicates.all(), + request -> ServerResponse.ok().syncBody("BAR")); + } + + @Test + public void invalidHttpMethod() throws Exception { + OkHttpClient client = new OkHttpClient(); + + Request request = new Request.Builder() + .method("BAZ", null) + .url("http://localhost:" + port + "/") + .build(); + + try (Response response = client.newCall(request).execute()) { + assertEquals("BAR", response.body().string()); + } + } +}