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 2009/07/26 14:11:25 UTC

svn commit: r797918 - in /camel/branches/camel-1.x: camel-core/src/main/java/org/apache/camel/converter/stream/ components/camel-http/src/main/java/org/apache/camel/component/http/ components/camel-jetty/src/test/java/org/apache/camel/component/jetty/

Author: davsclaus
Date: Sun Jul 26 12:11:24 2009
New Revision: 797918

URL: http://svn.apache.org/viewvc?rev=797918&view=rev
Log:
CAMEL-1849: stream caches spooled to disk is now deleted in case of http exception being thrown. Also http exception keeps a defensive copy of the response body stream so its detached from the real stream.

Modified:
    camel/branches/camel-1.x/camel-core/src/main/java/org/apache/camel/converter/stream/CachedOutputStream.java
    camel/branches/camel-1.x/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java
    camel/branches/camel-1.x/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpStreamCacheFileTest.java

Modified: camel/branches/camel-1.x/camel-core/src/main/java/org/apache/camel/converter/stream/CachedOutputStream.java
URL: http://svn.apache.org/viewvc/camel/branches/camel-1.x/camel-core/src/main/java/org/apache/camel/converter/stream/CachedOutputStream.java?rev=797918&r1=797917&r2=797918&view=diff
==============================================================================
--- camel/branches/camel-1.x/camel-core/src/main/java/org/apache/camel/converter/stream/CachedOutputStream.java (original)
+++ camel/branches/camel-1.x/camel-core/src/main/java/org/apache/camel/converter/stream/CachedOutputStream.java Sun Jul 26 12:11:24 2009
@@ -26,8 +26,6 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.List;
 import java.util.Map;
 
 import org.apache.camel.converter.IOConverter;
@@ -58,10 +56,7 @@
     private File tempFile;
 
     private File outputDir;   
-    
-    private List<Object> streamList = new ArrayList<Object>();
 
-    
     public CachedOutputStream() {
         currentStream = new ByteArrayOutputStream(2048);
         inmem = true;
@@ -129,7 +124,6 @@
     public void lockOutputStream() throws IOException {
         currentStream.flush();
         outputLocked = true;
-        streamList.remove(currentStream);
     }
     
     public void close() throws IOException {
@@ -181,7 +175,6 @@
                 if (copyOldContent) {
                     IOHelper.copyAndCloseInput(fin, out);
                 }
-                streamList.remove(currentStream);
                 tempFile.delete();
                 tempFile = null;
                 inmem = true;
@@ -353,15 +346,14 @@
     private void createFileOutputStream() throws IOException {
         ByteArrayOutputStream bout = (ByteArrayOutputStream)currentStream;
         if (outputDir == null) {
-            tempFile = FileUtil.createTempFile("cos", "tmp");
+            tempFile = FileUtil.createTempFile("cos", ".tmp");
         } else {
-            tempFile = FileUtil.createTempFile("cos", "tmp", outputDir, false);
+            tempFile = FileUtil.createTempFile("cos", ".tmp", outputDir, false);
         }
         
         currentStream = new BufferedOutputStream(new FileOutputStream(tempFile));
         bout.writeTo(currentStream);
         inmem = false;
-        streamList.add(currentStream);
     }
 
     public File getTempFile() {
@@ -384,7 +376,6 @@
                         maybeDeleteTempFile(this);
                     }
                 };
-                streamList.add(fileInputStream);
                 return fileInputStream;
             } catch (FileNotFoundException e) {
                 throw new IOException("Cached file was deleted, " + e.toString());
@@ -411,8 +402,7 @@
     }
     
     private void maybeDeleteTempFile(Object stream) {        
-        streamList.remove(stream);        
-        if (!inmem && tempFile != null && streamList.isEmpty()) {            
+        if (!inmem && tempFile != null) {
             tempFile.delete();
             tempFile = null;
             currentStream = new ByteArrayOutputStream(1024);

Modified: camel/branches/camel-1.x/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java
URL: http://svn.apache.org/viewvc/camel/branches/camel-1.x/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java?rev=797918&r1=797917&r2=797918&view=diff
==============================================================================
--- camel/branches/camel-1.x/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java (original)
+++ camel/branches/camel-1.x/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java Sun Jul 26 12:11:24 2009
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.component.http;
 
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
@@ -108,19 +109,28 @@
                 HttpOperationFailedException exception = null;
                 Header[] headers = method.getResponseHeaders();
                 InputStream is = extractResponseBody(method, exchange);
+
+                // make a defensive copy of the response body in the exception so its detached from the cache
+                InputStream copy = null;
+                if (is != null) {
+                    copy = new ByteArrayInputStream(exchange.getContext().getTypeConverter().convertTo(byte[].class, is));
+                    // close original stream so it can delete the temporary file if it has been spooled to disk by the CachedOutputStream
+                    is.close();
+                }
+
                 if (responseCode >= 300 && responseCode < 400) {
                     String redirectLocation;
                     Header locationHeader = method.getResponseHeader("location");
                     if (locationHeader != null) {
                         redirectLocation = locationHeader.getValue();
-                        exception = new HttpOperationFailedException(responseCode, method.getStatusLine(), redirectLocation, headers, is);
+                        exception = new HttpOperationFailedException(responseCode, method.getStatusLine(), redirectLocation, headers, copy);
                     } else {
                         // no redirect location
-                        exception = new HttpOperationFailedException(responseCode, method.getStatusLine(), headers, is);
+                        exception = new HttpOperationFailedException(responseCode, method.getStatusLine(), headers, copy);
                     }
                 } else {
                     // internal server error (error code 500)
-                    exception = new HttpOperationFailedException(responseCode, method.getStatusLine(), headers, is);
+                    exception = new HttpOperationFailedException(responseCode, method.getStatusLine(), headers, copy);
                 }
 
                 if (exception != null) {                    

Modified: camel/branches/camel-1.x/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpStreamCacheFileTest.java
URL: http://svn.apache.org/viewvc/camel/branches/camel-1.x/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpStreamCacheFileTest.java?rev=797918&r1=797917&r2=797918&view=diff
==============================================================================
--- camel/branches/camel-1.x/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpStreamCacheFileTest.java (original)
+++ camel/branches/camel-1.x/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpStreamCacheFileTest.java Sun Jul 26 12:11:24 2009
@@ -65,8 +65,7 @@
         // the temporary files should have been deleted
         File file = new File("./target/cachedir");
         String[] files = file.list();
-        // TODO: CAMEL-1849 when fixed this one passes
-        //assertEquals("There should be no files", files.length, 0);
+        assertEquals("There should be no files", files.length, 0);
     }
 
     @Override