From 946f4a3bf39627809d7429c3d772ff59c4dac82e Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Fri, 20 Jan 2017 17:44:58 +0000 Subject: [PATCH] Fix HTTP responses that caller asked to be JSON If caller says he accepts application/json we need to be sure that we send an array. That wasn't quite working and hadn't been tested. --- .../web/flux/FluxHttpMessageConverter.java | 2 +- .../web/flux/ResponseBodyEmitterSubscriber.java | 2 +- .../cloud/function/web/RestApplicationTests.java | 14 +++++++++++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/flux/FluxHttpMessageConverter.java b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/flux/FluxHttpMessageConverter.java index 7db689bf5..d760f954c 100644 --- a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/flux/FluxHttpMessageConverter.java +++ b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/flux/FluxHttpMessageConverter.java @@ -65,7 +65,7 @@ public class FluxHttpMessageConverter implements HttpMessageConverter implements Subscriber, Runnable { else { responseBodyEmitter.send(","); } - if (value.getClass()==String.class) { + if (value.getClass()==String.class && !((String)value).contains("\"")) { object = "\"" + value + "\""; } } diff --git a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/RestApplicationTests.java b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/RestApplicationTests.java index 2fe637ab1..167c59a67 100644 --- a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/RestApplicationTests.java +++ b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/RestApplicationTests.java @@ -34,6 +34,7 @@ import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.context.annotation.Bean; import org.springframework.http.MediaType; import org.springframework.http.RequestEntity; +import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.util.StringUtils; @@ -96,13 +97,24 @@ public class RestApplicationTests { .isEqualTo("[\"go\",\"home\"][\"come\",\"back\"]"); } + @Test + public void sentencesAcceptJson() throws Exception { + ResponseEntity result = rest.exchange( + RequestEntity.get(new URI("http://localhost:" + port + "/sentences")) + .accept(MediaType.APPLICATION_JSON).build(), + String.class); + assertThat(result.getBody()).isEqualTo("[[\"go\",\"home\"],[\"come\",\"back\"]]"); + // TODO: test this + // assertThat(result.getHeaders().getContentType()).isEqualTo(MediaType.APPLICATION_JSON); + } + @Test public void sentencesAcceptSse() throws Exception { assertThat(rest.exchange( RequestEntity.get(new URI("http://localhost:" + port + "/sentences")) .accept(EVENT_STREAM).build(), String.class).getBody()) - .isEqualTo(sse("[\"go\",\"home\"]","[\"come\",\"back\"]")); + .isEqualTo(sse("[\"go\",\"home\"]", "[\"come\",\"back\"]")); } @Test