From 2e88f4647e12cd501a17017ec8f2c1b29f645e4b Mon Sep 17 00:00:00 2001 From: Mark Fisher Date: Sat, 24 Jul 2010 00:59:51 +0000 Subject: [PATCH] generating a Map payload from request parameters for requests that do not contain a body --- .../HttpRequestHandlingMessagingGateway.java | 37 ++++++++++++++++--- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/spring-integration-http/src/main/java/org/springframework/integration/http/HttpRequestHandlingMessagingGateway.java b/spring-integration-http/src/main/java/org/springframework/integration/http/HttpRequestHandlingMessagingGateway.java index 4592ed436c..ff1bb4f639 100644 --- a/spring-integration-http/src/main/java/org/springframework/integration/http/HttpRequestHandlingMessagingGateway.java +++ b/spring-integration-http/src/main/java/org/springframework/integration/http/HttpRequestHandlingMessagingGateway.java @@ -26,6 +26,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.http.converter.ByteArrayHttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter; @@ -47,6 +48,7 @@ import org.springframework.integration.message.HeaderMapper; import org.springframework.integration.message.MessageBuilder; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; +import org.springframework.util.LinkedMultiValueMap; import org.springframework.web.HttpRequestHandler; /** @@ -102,17 +104,20 @@ public class HttpRequestHandlingMessagingGateway extends AbstractMessagingGatewa } + /** + * Specify the type of payload to be generated when the inbound HTTP request content + * is read by the {@link HttpMessageConverter}s. The default is byte[].class. + */ public void setExpectedType(Class expectedType) { Assert.notNull(expectedType, "expectedType must not be null"); this.expectedType = expectedType; } public final void handleRequest(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws ServletException, IOException { - this.doHandleRequest(new ServletServerHttpRequest(servletRequest), new ServletServerHttpResponse(servletResponse)); - } - - private void doHandleRequest(ServletServerHttpRequest request, ServletServerHttpResponse response) throws IOException { - Object payload = this.readPayload(request); + ServletServerHttpRequest request = new ServletServerHttpRequest(servletRequest); + ServletServerHttpResponse response = new ServletServerHttpResponse(servletResponse); + Object payload = (this.isReadable(request)) ? this.generatePayloadFromRequestBody(request) + : this.convertParameterMap(servletRequest.getParameterMap()); Map headers = this.headerMapper.toHeaders(request.getHeaders()); Message message = MessageBuilder.withPayload(payload).copyHeaders(headers).build(); if (this.expectReply) { @@ -128,8 +133,28 @@ public class HttpRequestHandlingMessagingGateway extends AbstractMessagingGatewa } } + private boolean isReadable(ServletServerHttpRequest request) { + HttpMethod method = request.getMethod(); + if (HttpMethod.GET.equals(method) || HttpMethod.HEAD.equals(method) || HttpMethod.OPTIONS.equals(method)) { + return false; + } + return request.getHeaders().getContentType() != null; + } + @SuppressWarnings("unchecked") - private Object readPayload(ServletServerHttpRequest request) throws IOException { + private LinkedMultiValueMap convertParameterMap(Map parameterMap) { + LinkedMultiValueMap convertedMap = new LinkedMultiValueMap(); + for (Object key : parameterMap.keySet()) { + String[] values = (String[]) parameterMap.get(key); + for (String value : values) { + convertedMap.add((String) key, value); + } + } + return convertedMap; + } + + @SuppressWarnings("unchecked") + private Object generatePayloadFromRequestBody(ServletServerHttpRequest request) throws IOException { MediaType contentType = request.getHeaders().getContentType(); for (HttpMessageConverter converter : this.messageConverters) { if (converter.canRead(this.expectedType, contentType)) {