Skip to content

Commit

Permalink
GH-1172 Ensure content-type set in a message is honored on the output
Browse files Browse the repository at this point in the history
Also, ensures that the proper content type is set in GCF FunctionInvoker

Resolves #1172
  • Loading branch information
olegz committed Sep 9, 2024
1 parent 90f7565 commit 03cc0b7
Show file tree
Hide file tree
Showing 7 changed files with 48 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,10 @@
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

public class PetData {
public final class PetData {
private PetData() {

}
private static List<String> breeds = new ArrayList<>();
static {
breeds.add("Afghan Hound");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,15 @@ public void service(HttpRequest httpRequest, HttpResponse httpResponse) throws E

if (result != null) {
MessageHeaders headers = result.getHeaders();
httpResponse.setContentType(result.getHeaders().get(MessageHeaders.CONTENT_TYPE).toString());
if (result.getHeaders().containsKey(MessageHeaders.CONTENT_TYPE)) {
httpResponse.setContentType(result.getHeaders().get(MessageHeaders.CONTENT_TYPE).toString());
}
else if (result.getHeaders().containsKey("Content-Type")) {
httpResponse.setContentType(result.getHeaders().get("Content-Type").toString());
}
else {
httpRequest.getContentType().ifPresent(contentType -> httpResponse.setContentType(contentType));
}
httpResponse.getWriter().write(new String(result.getPayload(), StandardCharsets.UTF_8));
for (Entry<String, Object> header : headers.entrySet()) {
Object values = header.getValue();
Expand All @@ -133,7 +141,6 @@ public void service(HttpRequest httpRequest, HttpResponse httpResponse) throws E
httpResponse.appendHeader(header.getKey(), header.getValue().toString());
}
}
httpRequest.getContentType().ifPresent(contentType -> httpResponse.setContentType(contentType));

if (headers.containsKey(HTTP_STATUS_CODE)) {
if (headers.get(HTTP_STATUS_CODE) instanceof Integer) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
import org.springframework.messaging.support.MessageBuilder;

import static java.util.Arrays.asList;
Expand Down Expand Up @@ -165,7 +166,7 @@ public void testStatusCodeSet() throws Exception {
bufferedWriter.close();

verify(response).setStatusCode(404);

verify(response).setContentType("text/plain");
}

@Test
Expand Down Expand Up @@ -200,7 +201,7 @@ public Function<String, Message<String>> function() {

String payload = "hello";

Message<String> msg = MessageBuilder.withPayload(payload).setHeader("statusCode", 404)
Message<String> msg = MessageBuilder.withPayload(payload).setHeader("statusCode", 404).setHeader(MessageHeaders.CONTENT_TYPE, "text/plain")
.build();

return x -> msg;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,16 @@
</extensions>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<executions>
<execution>
<id>checkstyle-validation</id>
<phase>none</phase>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.6.1</version>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,13 @@
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

public class PetData {
public final class PetData {
private static List<String> breeds = new ArrayList<>();

private PetData() {

}

static {
breeds.add("Afghan Hound");
breeds.add("Beagle");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,9 @@ public AnotherFilter anotherFilter() {
}

public static class SimpleFilter extends OncePerRequestFilter {
/**
*
*/
public boolean invoked;

@Override
Expand All @@ -146,6 +149,10 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse
}

public static class AnotherFilter extends OncePerRequestFilter {

/**
*
*/
public boolean invoked;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1438,9 +1438,15 @@ private Object convertMultipleOutputArgumentTypeIfNecesary(Object output, Type t
*/
@SuppressWarnings("unchecked")
private Object convertOutputMessageIfNecessary(Object output, String expectedOutputContetntType) {
String contentType = ((Message) output).getHeaders().containsKey(FunctionProperties.EXPECT_CONTENT_TYPE_HEADER)
? (String) ((Message) output).getHeaders().get(FunctionProperties.EXPECT_CONTENT_TYPE_HEADER)
: expectedOutputContetntType;
String contentType;
if (((Message) output).getHeaders().containsKey(MessageHeaders.CONTENT_TYPE)) {
contentType = ((Message) output).getHeaders().get(MessageHeaders.CONTENT_TYPE).toString();
}
else {
contentType = ((Message) output).getHeaders().containsKey(FunctionProperties.EXPECT_CONTENT_TYPE_HEADER)
? (String) ((Message) output).getHeaders().get(FunctionProperties.EXPECT_CONTENT_TYPE_HEADER)
: expectedOutputContetntType;
}

if (StringUtils.hasText(contentType)) {
Map<String, Object> headersMap = new HashMap(((Message) output).getHeaders());
Expand Down

0 comments on commit 03cc0b7

Please sign in to comment.