CAMEL-5806: HTTP components with producers should allow GET with data (a bit unusual but its allowed).
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/1ba5aa2f Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/1ba5aa2f Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/1ba5aa2f Branch: refs/heads/master Commit: 1ba5aa2f4b9c646d9b96fb1db43d6a5396e25e48 Parents: 4a29eb4 Author: Claus Ibsen <davscl...@apache.org> Authored: Mon Feb 16 13:22:25 2015 +0100 Committer: Claus Ibsen <davscl...@apache.org> Committed: Mon Feb 16 13:24:17 2015 +0100 ---------------------------------------------------------------------- .../apache/camel/component/http/DefaultHttpBinding.java | 12 +++++++++++- .../org/apache/camel/component/http/HttpConverter.java | 10 +++++++--- .../org/apache/camel/component/http/HttpMessage.java | 8 +++++++- .../camel/component/http4/DefaultHttpBinding.java | 12 +++++++++++- .../org/apache/camel/component/http4/HttpConverter.java | 12 ++++++++---- .../org/apache/camel/component/http4/HttpMessage.java | 8 ++++++++ .../camel/component/jetty/HttpStreamCacheFileTest.java | 1 + 7 files changed, 53 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/1ba5aa2f/components/camel-http/src/main/java/org/apache/camel/component/http/DefaultHttpBinding.java ---------------------------------------------------------------------- diff --git a/components/camel-http/src/main/java/org/apache/camel/component/http/DefaultHttpBinding.java b/components/camel-http/src/main/java/org/apache/camel/component/http/DefaultHttpBinding.java index b4c54fb..651c2ac 100644 --- a/components/camel-http/src/main/java/org/apache/camel/component/http/DefaultHttpBinding.java +++ b/components/camel-http/src/main/java/org/apache/camel/component/http/DefaultHttpBinding.java @@ -438,13 +438,23 @@ public class DefaultHttpBinding implements HttpBinding { // lets assume the body is a reader HttpServletRequest request = httpMessage.getRequest(); // there is only a body if we have a content length, or its -1 to indicate unknown length - if (request.getContentLength() == 0) { + int len = request.getContentLength(); + LOG.trace("HttpServletRequest content-length: {}", len); + if (len == 0) { return null; } if (isUseReaderForPayload()) { // use reader to read the response body return request.getReader(); } else { + // if we do not know if there is any data at all, then make sure to check the stream first + if (len < 0) { + InputStream is = request.getInputStream(); + if (is.available() == 0) { + // no data so return null + return null; + } + } // reade the response body from servlet request return HttpHelper.readResponseBodyFromServletRequest(request, httpMessage.getExchange()); } http://git-wip-us.apache.org/repos/asf/camel/blob/1ba5aa2f/components/camel-http/src/main/java/org/apache/camel/component/http/HttpConverter.java ---------------------------------------------------------------------- diff --git a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpConverter.java b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpConverter.java index 40ac6eb..2b7138d 100644 --- a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpConverter.java +++ b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpConverter.java @@ -19,7 +19,6 @@ package org.apache.camel.component.http; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; - import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -85,11 +84,16 @@ public final class HttpConverter { if (request == null) { return null; } + InputStream is = request.getInputStream(); + if (is != null && is.available() <= 0) { + // there is no data, so we cannot uncompress etc. + return is; + } if (exchange == null || !exchange.getProperty(Exchange.SKIP_GZIP_ENCODING, Boolean.FALSE, Boolean.class)) { String contentEncoding = request.getHeader(Exchange.CONTENT_ENCODING); - return GZIPHelper.uncompressGzip(contentEncoding, request.getInputStream()); + return GZIPHelper.uncompressGzip(contentEncoding, is); } else { - return request.getInputStream(); + return is; } } http://git-wip-us.apache.org/repos/asf/camel/blob/1ba5aa2f/components/camel-http/src/main/java/org/apache/camel/component/http/HttpMessage.java ---------------------------------------------------------------------- diff --git a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpMessage.java b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpMessage.java index 8218f2d..f8e8cfd 100644 --- a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpMessage.java +++ b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpMessage.java @@ -17,13 +17,13 @@ package org.apache.camel.component.http; import java.io.IOException; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.camel.Exchange; import org.apache.camel.RuntimeCamelException; import org.apache.camel.impl.DefaultMessage; +import org.apache.camel.util.ObjectHelper; /** * @version @@ -72,4 +72,10 @@ public class HttpMessage extends DefaultMessage { private HttpEndpoint getEndpoint() { return (HttpEndpoint) getExchange().getFromEndpoint(); } + + @Override + public String toString() { + // do not use toString on HTTP message + return "HttpMessage@" + ObjectHelper.getIdentityHashCode(this); + } } http://git-wip-us.apache.org/repos/asf/camel/blob/1ba5aa2f/components/camel-http4/src/main/java/org/apache/camel/component/http4/DefaultHttpBinding.java ---------------------------------------------------------------------- diff --git a/components/camel-http4/src/main/java/org/apache/camel/component/http4/DefaultHttpBinding.java b/components/camel-http4/src/main/java/org/apache/camel/component/http4/DefaultHttpBinding.java index aca11ab..7064c78 100644 --- a/components/camel-http4/src/main/java/org/apache/camel/component/http4/DefaultHttpBinding.java +++ b/components/camel-http4/src/main/java/org/apache/camel/component/http4/DefaultHttpBinding.java @@ -401,13 +401,23 @@ public class DefaultHttpBinding implements HttpBinding { // lets assume the body is a reader HttpServletRequest request = httpMessage.getRequest(); // there is only a body if we have a content length, or its -1 to indicate unknown length - if (request.getContentLength() == 0) { + int len = request.getContentLength(); + LOG.trace("HttpServletRequest content-length: {}", len); + if (len == 0) { return null; } if (isUseReaderForPayload()) { // use reader to read the response body return request.getReader(); } else { + // if we do not know if there is any data at all, then make sure to check the stream first + if (len < 0) { + InputStream is = request.getInputStream(); + if (is.available() == 0) { + // no data so return null + return null; + } + } // reade the response body from servlet request return HttpHelper.readResponseBodyFromServletRequest(request, httpMessage.getExchange()); } http://git-wip-us.apache.org/repos/asf/camel/blob/1ba5aa2f/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpConverter.java ---------------------------------------------------------------------- diff --git a/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpConverter.java b/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpConverter.java index 32b7c36..dead494 100644 --- a/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpConverter.java +++ b/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpConverter.java @@ -85,12 +85,16 @@ public final class HttpConverter { if (request == null) { return null; } - if (exchange == null - || !exchange.getProperty(Exchange.SKIP_GZIP_ENCODING, Boolean.FALSE, Boolean.class)) { + InputStream is = request.getInputStream(); + if (is != null && is.available() <= 0) { + // there is no data, so we cannot uncompress etc. + return is; + } + if (exchange == null || !exchange.getProperty(Exchange.SKIP_GZIP_ENCODING, Boolean.FALSE, Boolean.class)) { String contentEncoding = request.getHeader(Exchange.CONTENT_ENCODING); - return GZIPHelper.uncompressGzip(contentEncoding, request.getInputStream()); + return GZIPHelper.uncompressGzip(contentEncoding, is); } else { - return request.getInputStream(); + return is; } } http://git-wip-us.apache.org/repos/asf/camel/blob/1ba5aa2f/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpMessage.java ---------------------------------------------------------------------- diff --git a/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpMessage.java b/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpMessage.java index e88c171..30c8af0 100644 --- a/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpMessage.java +++ b/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpMessage.java @@ -24,6 +24,7 @@ import javax.servlet.http.HttpServletResponse; import org.apache.camel.Exchange; import org.apache.camel.RuntimeCamelException; import org.apache.camel.impl.DefaultMessage; +import org.apache.camel.util.ObjectHelper; /** * @version @@ -71,4 +72,11 @@ public class HttpMessage extends DefaultMessage { private HttpEndpoint getEndpoint() { return (HttpEndpoint) getExchange().getFromEndpoint(); } + + @Override + public String toString() { + // do not use toString on HTTP message + return "HttpMessage@" + ObjectHelper.getIdentityHashCode(this); + } + } http://git-wip-us.apache.org/repos/asf/camel/blob/1ba5aa2f/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/HttpStreamCacheFileTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/HttpStreamCacheFileTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/HttpStreamCacheFileTest.java index c72b418..5be4669 100644 --- a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/HttpStreamCacheFileTest.java +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/HttpStreamCacheFileTest.java @@ -21,6 +21,7 @@ import java.io.File; import org.apache.camel.CamelExecutionException; import org.apache.camel.Exchange; import org.apache.camel.Processor; +import org.apache.camel.StreamCache; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.http.HttpOperationFailedException; import org.apache.camel.converter.stream.CachedOutputStream;