You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2016/05/13 14:59:22 UTC

[1/2] camel git commit: CAMEL-9966: Restlet - Should not enable stream by default.

Repository: camel
Updated Branches:
  refs/heads/camel-2.16.x c1b40fb75 -> 7c887123e
  refs/heads/camel-2.17.x d5e2ce4e3 -> ae7a15cfc


CAMEL-9966: Restlet - Should not enable stream by default.


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/ae7a15cf
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/ae7a15cf
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/ae7a15cf

Branch: refs/heads/camel-2.17.x
Commit: ae7a15cfcf1f32c5dac14f72a09bf90b71a8f600
Parents: d5e2ce4
Author: Claus Ibsen <da...@apache.org>
Authored: Fri May 13 16:50:20 2016 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Fri May 13 16:58:43 2016 +0200

----------------------------------------------------------------------
 .../restlet/DefaultRestletBinding.java          | 27 ++++++++++-
 .../component/restlet/RestletEndpoint.java      | 51 ++++++++++++++++++--
 .../component/restlet/RestletOnCompletion.java  | 38 +++++++++++++++
 .../RestletProducerBinaryStreamTest.java        | 22 ++++++++-
 4 files changed, 129 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/ae7a15cf/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java
----------------------------------------------------------------------
diff --git a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java
index b95ef7a..3ab9d1b 100644
--- a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java
+++ b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java
@@ -76,6 +76,8 @@ public class DefaultRestletBinding implements RestletBinding, HeaderFilterStrate
     private static final Logger LOG = LoggerFactory.getLogger(DefaultRestletBinding.class);
     private static final String RFC_2822_DATE_PATTERN = "EEE, dd MMM yyyy HH:mm:ss Z";
     private HeaderFilterStrategy headerFilterStrategy;
+    private boolean streamRepresentation;
+    private boolean autoCloseStream;
 
     public void populateExchangeFromRestletRequest(Request request, Response response, Exchange exchange) throws Exception {
         Message inMessage = exchange.getIn();
@@ -363,9 +365,14 @@ public class DefaultRestletBinding implements RestletBinding, HeaderFilterStrate
                 LOG.debug("Setting the Content-Type to be {}",  mediaType.toString());
                 exchange.getOut().setHeader(Exchange.CONTENT_TYPE, mediaType.toString());
             }
-            if (response.getEntity() instanceof StreamRepresentation) {
+            if (streamRepresentation && response.getEntity() instanceof StreamRepresentation) {
                 Representation representationDecoded = new DecodeRepresentation(response.getEntity());
-                exchange.getOut().setBody(representationDecoded.getStream());
+                InputStream is = representationDecoded.getStream();
+                exchange.getOut().setBody(is);
+                if (autoCloseStream) {
+                    // ensure the input stream is closed when we are done routing
+                    exchange.addOnCompletion(new RestletOnCompletion(is));
+                }
             } else if (response.getEntity() instanceof Representation) {
                 Representation representationDecoded = new DecodeRepresentation(response.getEntity());
                 exchange.getOut().setBody(representationDecoded.getText());
@@ -584,4 +591,20 @@ public class DefaultRestletBinding implements RestletBinding, HeaderFilterStrate
     public void setHeaderFilterStrategy(HeaderFilterStrategy strategy) {
         headerFilterStrategy = strategy;
     }
+
+    public boolean isStreamRepresentation() {
+        return streamRepresentation;
+    }
+
+    public void setStreamRepresentation(boolean streamRepresentation) {
+        this.streamRepresentation = streamRepresentation;
+    }
+
+    public boolean isAutoCloseStream() {
+        return autoCloseStream;
+    }
+
+    public void setAutoCloseStream(boolean autoCloseStream) {
+        this.autoCloseStream = autoCloseStream;
+    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/ae7a15cf/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletEndpoint.java b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletEndpoint.java
index 5543313..0ba2689 100644
--- a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletEndpoint.java
+++ b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletEndpoint.java
@@ -16,12 +16,14 @@
  */
 package org.apache.camel.component.restlet;
 
+import java.io.InputStream;
 import java.util.List;
 import java.util.Map;
 
 import org.apache.camel.Consumer;
 import org.apache.camel.Exchange;
 import org.apache.camel.ExchangePattern;
+import org.apache.camel.Message;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.impl.DefaultEndpoint;
@@ -66,18 +68,22 @@ public class RestletEndpoint extends DefaultEndpoint implements HeaderFilterStra
     private Method[] restletMethods;
     @UriParam(label = "consumer")
     private List<String> restletUriPatterns;
-    @UriParam
+    @UriParam(label = "security")
     private Map<String, String> restletRealm;
-    @UriParam
+    @UriParam(label = "advanced")
     private HeaderFilterStrategy headerFilterStrategy;
-    @UriParam
+    @UriParam(label = "advanced")
     private RestletBinding restletBinding;
     @UriParam(label = "producer", defaultValue = "true")
     private boolean throwExceptionOnFailure = true;
-    @UriParam
+    @UriParam(label = "advanced")
     private boolean disableStreamCache;
-    @UriParam
+    @UriParam(label = "security")
     private SSLContextParameters sslContextParameters;
+    @UriParam(label = "producer,advanced")
+    private boolean streamRepresentation;
+    @UriParam(label = "producer,advanced")
+    private boolean autoCloseStream;
 
     public RestletEndpoint(RestletComponent component, String remaining) throws Exception {
         super(remaining, component);
@@ -306,6 +312,37 @@ public class RestletEndpoint extends DefaultEndpoint implements HeaderFilterStra
         this.sslContextParameters = scp;
     }
 
+    public boolean isStreamRepresentation() {
+        return streamRepresentation;
+    }
+
+    /**
+     * Whether to support stream representation as response from calling a REST service using the restlet producer.
+     * If the response is streaming then this option can be enabled to use an {@link java.io.InputStream} as the
+     * message body on the Camel {@link Message} body. If using this option you may want to enable the
+     * autoCloseStream option as well to ensure the input stream is closed when the Camel {@link Exchange}
+     * is done being routed. However if you need to read the stream outside a Camel route, you may need
+     * to not auto close the stream.
+     */
+    public void setStreamRepresentation(boolean streamRepresentation) {
+        this.streamRepresentation = streamRepresentation;
+    }
+
+    public boolean isAutoCloseStream() {
+        return autoCloseStream;
+    }
+
+    /**
+     * Whether to auto close the stream representation as response from calling a REST service using the restlet producer.
+     * If the response is streaming and the option streamRepresentation is enabled then you may want to auto close
+     * the {@link InputStream} from the streaming response to ensure the input stream is closed when the Camel {@link Exchange}
+     * is done being routed. However if you need to read the stream outside a Camel route, you may need
+     * to not auto close the stream.
+     */
+    public void setAutoCloseStream(boolean autoCloseStream) {
+        this.autoCloseStream = autoCloseStream;
+    }
+
     // Update the endpointUri with the restlet method information
     protected void updateEndpointUri() {
         String endpointUri = getEndpointUri();
@@ -336,6 +373,10 @@ public class RestletEndpoint extends DefaultEndpoint implements HeaderFilterStra
         if (restletBinding instanceof HeaderFilterStrategyAware) {
             ((HeaderFilterStrategyAware) restletBinding).setHeaderFilterStrategy(getHeaderFilterStrategy());
         }
+        if (restletBinding instanceof DefaultRestletBinding) {
+            ((DefaultRestletBinding) restletBinding).setStreamRepresentation(isStreamRepresentation());
+            ((DefaultRestletBinding) restletBinding).setAutoCloseStream(isAutoCloseStream());
+        }
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/camel/blob/ae7a15cf/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletOnCompletion.java
----------------------------------------------------------------------
diff --git a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletOnCompletion.java b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletOnCompletion.java
new file mode 100644
index 0000000..5c2f684
--- /dev/null
+++ b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletOnCompletion.java
@@ -0,0 +1,38 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.restlet;
+
+import java.io.InputStream;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.support.SynchronizationAdapter;
+import org.apache.camel.util.IOHelper;
+
+public class RestletOnCompletion extends SynchronizationAdapter {
+
+    private final InputStream inputStream;
+
+    public RestletOnCompletion(InputStream inputStream) {
+        this.inputStream = inputStream;
+    }
+
+    @Override
+    public void onDone(Exchange exchange) {
+        IOHelper.close(inputStream);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/ae7a15cf/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerBinaryStreamTest.java
----------------------------------------------------------------------
diff --git a/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerBinaryStreamTest.java b/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerBinaryStreamTest.java
index 4cb24e7..bc15e17 100644
--- a/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerBinaryStreamTest.java
+++ b/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerBinaryStreamTest.java
@@ -17,6 +17,8 @@
 package org.apache.camel.component.restlet;
 
 import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.builder.RouteBuilder;
@@ -34,7 +36,7 @@ public class RestletProducerBinaryStreamTest extends RestletTestSupport {
 
     @Test
     public void shouldHandleBinaryOctetStream() throws Exception {
-        Exchange response = template.request("restlet:http://localhost:" + portNum + "/application/octet-stream", null);
+        Exchange response = template.request("restlet:http://localhost:" + portNum + "/application/octet-stream?streamRepresentation=true", null);
 
         assertThat(response.getOut().getHeader(CONTENT_TYPE, String.class), equalTo("application/octet-stream"));
         assertThat(response.getOut().getBody(byte[].class), equalTo(getAllBytes()));
@@ -42,12 +44,28 @@ public class RestletProducerBinaryStreamTest extends RestletTestSupport {
 
     @Test
     public void shouldHandleBinaryAudioMpeg() throws Exception {
-        Exchange response = template.request("restlet:http://localhost:" + portNum + "/audio/mpeg", null);
+        Exchange response = template.request("restlet:http://localhost:" + portNum + "/audio/mpeg?streamRepresentation=true", null);
 
         assertThat(response.getOut().getHeader(CONTENT_TYPE, String.class), equalTo("audio/mpeg"));
         assertThat(response.getOut().getBody(byte[].class), equalTo(getAllBytes()));
     }
 
+    @Test
+    public void shouldAutoClose() throws Exception {
+        Exchange response = template.request("restlet:http://localhost:" + portNum + "/application/octet-stream?streamRepresentation=true&autoCloseStream=true", null);
+
+        assertThat(response.getOut().getHeader(CONTENT_TYPE, String.class), equalTo("application/octet-stream"));
+        InputStream is = (InputStream) response.getOut().getBody();
+        assertNotNull(is);
+
+        try {
+            is.read();
+            fail("Should be closed");
+        } catch (IOException e) {
+            // expected
+        }
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {


[2/2] camel git commit: CAMEL-9966: Restlet - Should not enable stream by default.

Posted by da...@apache.org.
CAMEL-9966: Restlet - Should not enable stream by default.


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/7c887123
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/7c887123
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/7c887123

Branch: refs/heads/camel-2.16.x
Commit: 7c887123e4508f549fdb1c1de48ad59f85eb0da6
Parents: c1b40fb
Author: Claus Ibsen <da...@apache.org>
Authored: Fri May 13 16:50:20 2016 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Fri May 13 16:58:59 2016 +0200

----------------------------------------------------------------------
 .../restlet/DefaultRestletBinding.java          | 27 ++++++++++-
 .../component/restlet/RestletEndpoint.java      | 51 ++++++++++++++++++--
 .../component/restlet/RestletOnCompletion.java  | 38 +++++++++++++++
 .../RestletProducerBinaryStreamTest.java        | 22 ++++++++-
 4 files changed, 129 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/7c887123/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java
----------------------------------------------------------------------
diff --git a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java
index 80ddd4c..6765ce4 100644
--- a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java
+++ b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java
@@ -76,6 +76,8 @@ public class DefaultRestletBinding implements RestletBinding, HeaderFilterStrate
     private static final Logger LOG = LoggerFactory.getLogger(DefaultRestletBinding.class);
     private static final String RFC_2822_DATE_PATTERN = "EEE, dd MMM yyyy HH:mm:ss Z";
     private HeaderFilterStrategy headerFilterStrategy;
+    private boolean streamRepresentation;
+    private boolean autoCloseStream;
 
     public void populateExchangeFromRestletRequest(Request request, Response response, Exchange exchange) throws Exception {
         Message inMessage = exchange.getIn();
@@ -365,9 +367,14 @@ public class DefaultRestletBinding implements RestletBinding, HeaderFilterStrate
                 LOG.debug("Setting the Content-Type to be {}",  mediaType.toString());
                 exchange.getOut().setHeader(Exchange.CONTENT_TYPE, mediaType.toString());
             }
-            if (response.getEntity() instanceof StreamRepresentation) {
+            if (streamRepresentation && response.getEntity() instanceof StreamRepresentation) {
                 Representation representationDecoded = new DecodeRepresentation(response.getEntity());
-                exchange.getOut().setBody(representationDecoded.getStream());
+                InputStream is = representationDecoded.getStream();
+                exchange.getOut().setBody(is);
+                if (autoCloseStream) {
+                    // ensure the input stream is closed when we are done routing
+                    exchange.addOnCompletion(new RestletOnCompletion(is));
+                }
             } else if (response.getEntity() instanceof Representation) {
                 Representation representationDecoded = new DecodeRepresentation(response.getEntity());
                 exchange.getOut().setBody(representationDecoded.getText());
@@ -579,4 +586,20 @@ public class DefaultRestletBinding implements RestletBinding, HeaderFilterStrate
     public void setHeaderFilterStrategy(HeaderFilterStrategy strategy) {
         headerFilterStrategy = strategy;
     }
+
+    public boolean isStreamRepresentation() {
+        return streamRepresentation;
+    }
+
+    public void setStreamRepresentation(boolean streamRepresentation) {
+        this.streamRepresentation = streamRepresentation;
+    }
+
+    public boolean isAutoCloseStream() {
+        return autoCloseStream;
+    }
+
+    public void setAutoCloseStream(boolean autoCloseStream) {
+        this.autoCloseStream = autoCloseStream;
+    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/7c887123/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletEndpoint.java b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletEndpoint.java
index a88a6fb..1fa26f5 100644
--- a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletEndpoint.java
+++ b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletEndpoint.java
@@ -16,12 +16,14 @@
  */
 package org.apache.camel.component.restlet;
 
+import java.io.InputStream;
 import java.util.List;
 import java.util.Map;
 
 import org.apache.camel.Consumer;
 import org.apache.camel.Exchange;
 import org.apache.camel.ExchangePattern;
+import org.apache.camel.Message;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.impl.DefaultEndpoint;
@@ -68,18 +70,22 @@ public class RestletEndpoint extends DefaultEndpoint implements HeaderFilterStra
     private Method[] restletMethods;
     @UriParam(label = "consumer")
     private List<String> restletUriPatterns;
-    @UriParam
+    @UriParam(label = "security")
     private Map<String, String> restletRealm;
-    @UriParam
+    @UriParam(label = "advanced")
     private HeaderFilterStrategy headerFilterStrategy;
-    @UriParam
+    @UriParam(label = "advanced")
     private RestletBinding restletBinding;
     @UriParam(label = "producer", defaultValue = "true")
     private boolean throwExceptionOnFailure = true;
-    @UriParam
+    @UriParam(label = "advanced")
     private boolean disableStreamCache;
-    @UriParam
+    @UriParam(label = "security")
     private SSLContextParameters sslContextParameters;
+    @UriParam(label = "producer,advanced")
+    private boolean streamRepresentation;
+    @UriParam(label = "producer,advanced")
+    private boolean autoCloseStream;
 
     public RestletEndpoint(RestletComponent component, String remaining) throws Exception {
         super(remaining, component);
@@ -308,6 +314,37 @@ public class RestletEndpoint extends DefaultEndpoint implements HeaderFilterStra
         this.sslContextParameters = scp;
     }
 
+    public boolean isStreamRepresentation() {
+        return streamRepresentation;
+    }
+
+    /**
+     * Whether to support stream representation as response from calling a REST service using the restlet producer.
+     * If the response is streaming then this option can be enabled to use an {@link java.io.InputStream} as the
+     * message body on the Camel {@link Message} body. If using this option you may want to enable the
+     * autoCloseStream option as well to ensure the input stream is closed when the Camel {@link Exchange}
+     * is done being routed. However if you need to read the stream outside a Camel route, you may need
+     * to not auto close the stream.
+     */
+    public void setStreamRepresentation(boolean streamRepresentation) {
+        this.streamRepresentation = streamRepresentation;
+    }
+
+    public boolean isAutoCloseStream() {
+        return autoCloseStream;
+    }
+
+    /**
+     * Whether to auto close the stream representation as response from calling a REST service using the restlet producer.
+     * If the response is streaming and the option streamRepresentation is enabled then you may want to auto close
+     * the {@link InputStream} from the streaming response to ensure the input stream is closed when the Camel {@link Exchange}
+     * is done being routed. However if you need to read the stream outside a Camel route, you may need
+     * to not auto close the stream.
+     */
+    public void setAutoCloseStream(boolean autoCloseStream) {
+        this.autoCloseStream = autoCloseStream;
+    }
+
     // Update the endpointUri with the restlet method information
     protected void updateEndpointUri() {
         String endpointUri = getEndpointUri();
@@ -338,6 +375,10 @@ public class RestletEndpoint extends DefaultEndpoint implements HeaderFilterStra
         if (restletBinding instanceof HeaderFilterStrategyAware) {
             ((HeaderFilterStrategyAware) restletBinding).setHeaderFilterStrategy(getHeaderFilterStrategy());
         }
+        if (restletBinding instanceof DefaultRestletBinding) {
+            ((DefaultRestletBinding) restletBinding).setStreamRepresentation(isStreamRepresentation());
+            ((DefaultRestletBinding) restletBinding).setAutoCloseStream(isAutoCloseStream());
+        }
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/camel/blob/7c887123/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletOnCompletion.java
----------------------------------------------------------------------
diff --git a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletOnCompletion.java b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletOnCompletion.java
new file mode 100644
index 0000000..5c2f684
--- /dev/null
+++ b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletOnCompletion.java
@@ -0,0 +1,38 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.restlet;
+
+import java.io.InputStream;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.support.SynchronizationAdapter;
+import org.apache.camel.util.IOHelper;
+
+public class RestletOnCompletion extends SynchronizationAdapter {
+
+    private final InputStream inputStream;
+
+    public RestletOnCompletion(InputStream inputStream) {
+        this.inputStream = inputStream;
+    }
+
+    @Override
+    public void onDone(Exchange exchange) {
+        IOHelper.close(inputStream);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/7c887123/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerBinaryStreamTest.java
----------------------------------------------------------------------
diff --git a/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerBinaryStreamTest.java b/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerBinaryStreamTest.java
index 4cb24e7..bc15e17 100644
--- a/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerBinaryStreamTest.java
+++ b/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerBinaryStreamTest.java
@@ -17,6 +17,8 @@
 package org.apache.camel.component.restlet;
 
 import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.builder.RouteBuilder;
@@ -34,7 +36,7 @@ public class RestletProducerBinaryStreamTest extends RestletTestSupport {
 
     @Test
     public void shouldHandleBinaryOctetStream() throws Exception {
-        Exchange response = template.request("restlet:http://localhost:" + portNum + "/application/octet-stream", null);
+        Exchange response = template.request("restlet:http://localhost:" + portNum + "/application/octet-stream?streamRepresentation=true", null);
 
         assertThat(response.getOut().getHeader(CONTENT_TYPE, String.class), equalTo("application/octet-stream"));
         assertThat(response.getOut().getBody(byte[].class), equalTo(getAllBytes()));
@@ -42,12 +44,28 @@ public class RestletProducerBinaryStreamTest extends RestletTestSupport {
 
     @Test
     public void shouldHandleBinaryAudioMpeg() throws Exception {
-        Exchange response = template.request("restlet:http://localhost:" + portNum + "/audio/mpeg", null);
+        Exchange response = template.request("restlet:http://localhost:" + portNum + "/audio/mpeg?streamRepresentation=true", null);
 
         assertThat(response.getOut().getHeader(CONTENT_TYPE, String.class), equalTo("audio/mpeg"));
         assertThat(response.getOut().getBody(byte[].class), equalTo(getAllBytes()));
     }
 
+    @Test
+    public void shouldAutoClose() throws Exception {
+        Exchange response = template.request("restlet:http://localhost:" + portNum + "/application/octet-stream?streamRepresentation=true&autoCloseStream=true", null);
+
+        assertThat(response.getOut().getHeader(CONTENT_TYPE, String.class), equalTo("application/octet-stream"));
+        InputStream is = (InputStream) response.getOut().getBody();
+        assertNotNull(is);
+
+        try {
+            is.read();
+            fail("Should be closed");
+        } catch (IOException e) {
+            // expected
+        }
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {