From 863934709da9378634bf3fa39212cda5cc00c24b Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Wed, 31 May 2023 21:48:57 +0200 Subject: [PATCH] GH-1025 Ensure DELETE can only be mapped to a Consumer --- .../function/web/mvc/FunctionController.java | 2 + .../web/mvc/HttpDeleteIntegrationTests.java | 40 ++++++++++--------- .../web/mvc/HttpPostIntegrationTests.java | 2 - 3 files changed, 24 insertions(+), 20 deletions(-) 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 bf390d11f..e64cbc9c4 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 @@ -40,6 +40,7 @@ import org.springframework.http.ResponseEntity.BodyBuilder; import org.springframework.messaging.Message; import org.springframework.messaging.support.MessageBuilder; import org.springframework.stereotype.Component; +import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.MultiValueMap; import org.springframework.util.StringUtils; @@ -161,6 +162,7 @@ public class FunctionController { public void delete(WebRequest request, @RequestBody(required = false) String body) { FunctionWrapper wrapper = wrapper(request); if (FunctionWebRequestProcessingHelper.isValidFunction("DELETE", wrapper.getFunction().getFunctionDefinition(), this.functionHttpProperties)) { + Assert.isTrue(wrapper.getFunction().isConsumer(), "'DELETE' can only be mapped to Consumer"); FunctionWebRequestProcessingHelper.processRequest(wrapper, wrapper.getArgument(), false); } else { diff --git a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HttpDeleteIntegrationTests.java b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HttpDeleteIntegrationTests.java index e34cbc200..f27de5431 100644 --- a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HttpDeleteIntegrationTests.java +++ b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HttpDeleteIntegrationTests.java @@ -16,24 +16,18 @@ package org.springframework.cloud.function.web.mvc; +import static org.assertj.core.api.Assertions.assertThat; + import java.net.URI; import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Consumer; import java.util.function.Function; -import java.util.stream.Collectors; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; @@ -45,27 +39,19 @@ import org.springframework.cloud.function.web.RestApplication; import org.springframework.cloud.function.web.mvc.HttpDeleteIntegrationTests.ApplicationConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; import org.springframework.messaging.Message; -import org.springframework.messaging.support.MessageBuilder; import org.springframework.test.context.ContextConfiguration; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; -import org.springframework.util.StringUtils; - -import static org.assertj.core.api.Assertions.assertThat; +import org.springframework.util.MimeType; /** * @author Oleg Zhurakousky */ @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, properties = "spring.main.web-application-type=servlet") -@ContextConfiguration(classes = { RestApplication.class, ApplicationConfiguration.class }) +@ContextConfiguration(classes = {ApplicationConfiguration.class}) public class HttpDeleteIntegrationTests { - private static final MediaType EVENT_STREAM = MediaType.TEXT_EVENT_STREAM; - @LocalServerPort private int port; @@ -98,6 +84,14 @@ public class HttpDeleteIntegrationTests { assertThat(result.getStatusCode()).isEqualTo(HttpStatus.NO_CONTENT); } + @Test + public void testDeleteWithFunction() throws Exception { + ResponseEntity result = this.rest.exchange( + RequestEntity.delete(new URI("/deleteFunction")) + .build(), Void.class); + assertThat(result.getStatusCode()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR); + } + @EnableAutoConfiguration @TestConfiguration public static class ApplicationConfiguration { @@ -109,6 +103,16 @@ public class HttpDeleteIntegrationTests { args); } + @Bean + public Function deleteFunction() { + return v -> { + assertThat(v).isEqualTo("123"); + System.out.println("Deleting: " + v); + return null; + }; + } + + @Bean public Consumer deleteConsumer() { return v -> { diff --git a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HttpPostIntegrationTests.java b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HttpPostIntegrationTests.java index b1a1fba39..a12c46dcf 100644 --- a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HttpPostIntegrationTests.java +++ b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HttpPostIntegrationTests.java @@ -64,8 +64,6 @@ import static org.assertj.core.api.Assertions.assertThat; @ContextConfiguration(classes = { RestApplication.class, ApplicationConfiguration.class }) public class HttpPostIntegrationTests { - private static final MediaType EVENT_STREAM = MediaType.TEXT_EVENT_STREAM; - @LocalServerPort private int port;