From 65c0b610914d5687ad9603bc88469830e333966d Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Thu, 1 Jun 2023 08:51:10 +0200 Subject: [PATCH] GH-1025 Ad more test for DELETE method --- .../function/web/FunctionHttpProperties.java | 35 +++++++++---------- .../function/web/mvc/FunctionController.java | 3 -- .../FunctionWebRequestProcessingHelper.java | 11 +++--- .../web/mvc/GeneralIntegrationTests.java | 34 ++++++++++++------ 4 files changed, 45 insertions(+), 38 deletions(-) diff --git a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/FunctionHttpProperties.java b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/FunctionHttpProperties.java index 66e527f99..c6b9bd87a 100644 --- a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/FunctionHttpProperties.java +++ b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/FunctionHttpProperties.java @@ -16,8 +16,6 @@ package org.springframework.cloud.function.web; -import java.util.List; - import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.cloud.function.context.FunctionProperties; @@ -27,60 +25,59 @@ import org.springframework.cloud.function.context.FunctionProperties; * @since 4.0.4 * */ - @ConfigurationProperties(prefix = FunctionProperties.PREFIX + ".http") public class FunctionHttpProperties { /** - * Blah. + * Function definition mappings for GET method (e.g. 'spring.cloud.function.http.GET=foo;bar|baz') */ - public List get; + public String get; /** - * Blah. + * Function definition mappings for POST method (e.g. 'spring.cloud.function.http.POST=foo;bar|baz') */ - public List post; + public String post; /** - * Blah. + * Function definition mappings for PUT method (e.g. 'spring.cloud.function.http.PUT=foo;bar|baz') */ - public List put; + public String put; /** - * Blah. + * Function definition mappings for DELETE method (e.g. 'spring.cloud.function.http.DELETE=foo;bar|baz') */ - public List delete; + public String delete; - public List getGet() { + public String getGet() { return this.get; } - public void setGet(List get) { + public void setGet(String get) { this.get = get; } - public List getPost() { + public String getPost() { return post; } - public void setPost(List post) { + public void setPost(String post) { this.post = post; } - public List getPut() { + public String getPut() { return put; } - public void setPut(List put) { + public void setPut(String put) { this.put = put; } - public List getDelete() { + public String getDelete() { return delete; } - public void setDelete(List delete) { + public void setDelete(String delete) { this.delete = delete; } } diff --git a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/mvc/FunctionController.java b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/mvc/FunctionController.java index e64cbc9c4..7dddb35b9 100644 --- a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/mvc/FunctionController.java +++ b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/mvc/FunctionController.java @@ -24,7 +24,6 @@ import java.util.stream.Collectors; import org.reactivestreams.Publisher; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import reactor.netty.http.server.HttpServerRequest; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.function.context.catalog.SimpleFunctionRegistry.FunctionInvocationWrapper; @@ -56,8 +55,6 @@ import org.springframework.web.context.request.WebRequest; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest; -import jakarta.servlet.http.HttpServletRequest; - /** * @author Dave Syer * @author Mark Fisher diff --git a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/util/FunctionWebRequestProcessingHelper.java b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/util/FunctionWebRequestProcessingHelper.java index cbcfe8588..43af8d426 100644 --- a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/util/FunctionWebRequestProcessingHelper.java +++ b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/util/FunctionWebRequestProcessingHelper.java @@ -16,6 +16,7 @@ package org.springframework.cloud.function.web.util; +import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -34,7 +35,6 @@ import org.springframework.cloud.function.web.FunctionHttpProperties; import org.springframework.cloud.function.web.constants.WebRequestConstants; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; -import org.springframework.http.RequestEntity.HeadersBuilder; import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity.BodyBuilder; import org.springframework.messaging.Message; @@ -42,8 +42,6 @@ import org.springframework.messaging.support.MessageBuilder; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; - - /** * !INTERNAL USE ONLY! * @@ -74,7 +72,7 @@ public final class FunctionWebRequestProcessingHelper { } public static boolean isValidFunction(String httpMethod, String functionDefinition, FunctionHttpProperties functionHttpProperties) { - List functionDefinitions = null; + String functionDefinitions = null; switch (httpMethod) { case "GET": functionDefinitions = functionHttpProperties.getGet(); @@ -91,7 +89,10 @@ public final class FunctionWebRequestProcessingHelper { default: return false; } - return CollectionUtils.isEmpty(functionDefinitions) || functionDefinitions.contains(functionDefinition); + if (StringUtils.hasText(functionDefinitions)) { + return Arrays.asList(functionDefinitions.split(";")).contains(functionDefinition); + } + return false; } public static String buildBadMappingErrorMessage(String httpMethod, String functionDefinition) { diff --git a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/GeneralIntegrationTests.java b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/GeneralIntegrationTests.java index 7e2ab37fb..c3af4c333 100644 --- a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/GeneralIntegrationTests.java +++ b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/GeneralIntegrationTests.java @@ -17,28 +17,20 @@ package org.springframework.cloud.function.web.mvc; import java.net.URI; -import java.util.List; import java.util.function.Consumer; import java.util.function.Function; +import java.util.function.Supplier; import org.junit.jupiter.api.Test; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.cloud.function.json.JsonMapper; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; -import org.springframework.core.io.ClassPathResource; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.web.multipart.MultipartFile; import static org.assertj.core.api.Assertions.assertThat; /** @@ -49,9 +41,9 @@ public class GeneralIntegrationTests { @Test public void testMappedAndUnmappedDeleteFunction() throws Exception { - ApplicationContext context = SpringApplication.run(MultipleConsumerConfiguration.class, "--server.port=0", "--spring.cloud.function.http.DELETE=delete2"); + ApplicationContext context = SpringApplication.run(MultipleConsumerConfiguration.class, "--server.port=0", + "--spring.cloud.function.http.DELETE=delete2;deleteFunction|delete1"); String port = context.getEnvironment().getProperty("local.server.port"); - JsonMapper mapper = context.getBean(JsonMapper.class); TestRestTemplate template = new TestRestTemplate(); ResponseEntity result = template.exchange( @@ -63,6 +55,16 @@ public class GeneralIntegrationTests { RequestEntity.delete(new URI("http://localhost:" + port + "/delete2")) .build(), Void.class); assertThat(result.getStatusCode()).isEqualTo(HttpStatus.NO_CONTENT); + + result = template.exchange( + RequestEntity.delete(new URI("http://localhost:" + port + "/deleteFunction,delete1")) + .build(), Void.class); + assertThat(result.getStatusCode()).isEqualTo(HttpStatus.NO_CONTENT); + + result = template.exchange( + RequestEntity.delete(new URI("http://localhost:" + port + "/supplier")) + .build(), Void.class); + assertThat(result.getStatusCode()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR); } @@ -78,5 +80,15 @@ public class GeneralIntegrationTests { public Consumer delete2() { return v -> {}; } + + @Bean + public Function deleteFunction() { + return v -> v; + } + + @Bean + public Supplier supplier() { + return () -> ""; + } } }