Skip to content

Commit

Permalink
Restrict HTTP methods on Reactive HiddenHttpMethodFilter
Browse files Browse the repository at this point in the history
This commit restricts the allowed HTTP methods on HiddenHttpMethodFilter
(Reactive variant) to the following: PUT, DELETE, PATCH.

This filter is meant to be used to simulate those methods from HTML
forms sent by browsers, so no other methods are allowed.

Issue: SPR-16836
  • Loading branch information
bclozel committed Jun 11, 2018
1 parent f64fa3d commit a5cd01a
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 3 deletions.
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2017 the original author or authors.
* Copyright 2002-2018 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.
Expand All @@ -16,6 +16,9 @@

package org.springframework.web.filter.reactive;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Locale;

import reactor.core.publisher.Mono;
Expand Down Expand Up @@ -45,6 +48,10 @@
*/
public class HiddenHttpMethodFilter implements WebFilter {

private static final List<HttpMethod> ALLOWED_METHODS =
Collections.unmodifiableList(Arrays.asList(HttpMethod.PUT,
HttpMethod.DELETE, HttpMethod.PATCH));

/** Default name of the form parameter with the HTTP method to use */
public static final String DEFAULT_METHOD_PARAMETER_NAME = "_method";

Expand Down Expand Up @@ -87,7 +94,12 @@ public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
private ServerWebExchange mapExchange(ServerWebExchange exchange, String methodParamValue) {
HttpMethod httpMethod = HttpMethod.resolve(methodParamValue.toUpperCase(Locale.ENGLISH));
Assert.notNull(httpMethod, () -> "HttpMethod '" + methodParamValue + "' not supported");
return exchange.mutate().request(builder -> builder.method(httpMethod)).build();
if (ALLOWED_METHODS.contains(httpMethod)) {
return exchange.mutate().request(builder -> builder.method(httpMethod)).build();
}
else {
return exchange;
}
}

}
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2017 the original author or authors.
* Copyright 2002-2018 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.
Expand Down Expand Up @@ -52,6 +52,12 @@ public void filterWithParameter() {
assertEquals(HttpMethod.DELETE, this.filterChain.getHttpMethod());
}

@Test
public void filterWithParameterMethodNotAllowed() {
postForm("_method=TRACE").block(Duration.ZERO);
assertEquals(HttpMethod.POST, this.filterChain.getHttpMethod());
}

@Test
public void filterWithNoParameter() {
postForm("").block(Duration.ZERO);
Expand Down

0 comments on commit a5cd01a

Please sign in to comment.