From 809790f0682dcd8fa9b5462835e8d9a668b5761c Mon Sep 17 00:00:00 2001 From: Mark Fisher Date: Fri, 20 Feb 2009 04:36:57 +0000 Subject: [PATCH] Determining payload type to extract based on request method and content type. --- .../integration/http/HttpInboundGateway.java | 87 +++++++++++++++++-- 1 file changed, 81 insertions(+), 6 deletions(-) diff --git a/org.springframework.integration.http/src/main/java/org/springframework/integration/http/HttpInboundGateway.java b/org.springframework.integration.http/src/main/java/org/springframework/integration/http/HttpInboundGateway.java index 94d9b4a6dd..3fd524fb8c 100644 --- a/org.springframework.integration.http/src/main/java/org/springframework/integration/http/HttpInboundGateway.java +++ b/org.springframework.integration.http/src/main/java/org/springframework/integration/http/HttpInboundGateway.java @@ -16,7 +16,9 @@ package org.springframework.integration.http; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; @@ -25,6 +27,7 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.springframework.integration.core.Message; import org.springframework.integration.gateway.SimpleMessagingGateway; import org.springframework.integration.message.MessageBuilder; import org.springframework.web.HttpRequestHandler; @@ -35,12 +38,31 @@ import org.springframework.web.HttpRequestHandler; */ public class HttpInboundGateway extends SimpleMessagingGateway implements HttpRequestHandler { - public void handleRequest(HttpServletRequest request, - HttpServletResponse response) throws ServletException, IOException { + private volatile boolean extractPayload = true; - MessageBuilder builder = MessageBuilder.withPayload(request.getParameterMap()); - this.populateHeaders(request, builder); - Object result = this.sendAndReceive(builder.build()); + + /** + * Specify whether the inbound request's content should be passed as + * the payload of the Message. If this is set to 'false', the entire + * request will be sent as the payload. Otherwise, for a GET request + * the parameter map will be the payload, and for a POST request the + * body will be extracted. In the case of a POST request, the type of + * the payload depends on the Content-Type of the request. + * The default value is 'true'. + */ + public void setExtractPayload(boolean extractPayload) { + this.extractPayload = extractPayload; + } + + public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + Message message = null; + if (this.extractPayload) { + message = this.createMessageFromRequestPayload(request); + } + else { + message = MessageBuilder.withPayload(request).build(); + } + Object result = this.sendAndReceive(message); if (result instanceof String) { response.getWriter().print((String) result); response.flushBuffer(); @@ -54,7 +76,57 @@ public class HttpInboundGateway extends SimpleMessagingGateway implements HttpRe } } - private void populateHeaders(HttpServletRequest request, MessageBuilder builder) { + private Message createMessageFromRequestPayload(HttpServletRequest request) throws IOException { + Message message = null; + String contentType = request.getContentType(); + if (request.getMethod().equals("GET")) { + if (logger.isDebugEnabled()) { + logger.debug("received GET request, using parameter map as payload"); + } + MessageBuilder builder = MessageBuilder.withPayload(request.getParameterMap()); + this.populateHeaders(request, builder, false); + message = builder.build(); + } + else if (request.getMethod().equals("POST")) { + Object payload = null; + if (contentType != null && contentType.startsWith("text")) { + if (logger.isDebugEnabled()) { + logger.debug("received POST request, creating payload with text content"); + } + StringBuilder sb = new StringBuilder(); + BufferedReader reader = request.getReader(); + String line = reader.readLine(); + while (line != null) { + sb.append(line); + line = reader.readLine(); + } + payload = sb.toString(); + } + else { + InputStream stream = request.getInputStream(); + int length = request.getContentLength(); + if (length == -1) { + length = 1024; + } + if (logger.isDebugEnabled()) { + logger.debug("received POST request, creating byte array payload with content lenth: " + length); + } + byte[] bytes = new byte[length]; + stream.read(bytes, 0, length); + payload = bytes; + } + MessageBuilder builder = MessageBuilder.withPayload(payload); + this.populateHeaders(request, builder, true); + message = builder.build(); + } + else { + throw new UnsupportedOperationException("unsupported method: " + request.getMethod()); + } + return message; + } + + @SuppressWarnings("unchecked") + private void populateHeaders(HttpServletRequest request, MessageBuilder builder, boolean includeParameters) { Enumeration headerNames = request.getHeaderNames(); if (headerNames != null) { while (headerNames.hasMoreElements()) { @@ -74,6 +146,9 @@ public class HttpInboundGateway extends SimpleMessagingGateway implements HttpRe } } } + if (includeParameters) { + builder.copyHeaders(request.getParameterMap()); + } } }