You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by pm...@apache.org on 2012/07/17 23:27:43 UTC

svn commit: r1362663 - /jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java

Author: pmouawad
Date: Tue Jul 17 21:27:42 2012
New Revision: 1362663

URL: http://svn.apache.org/viewvc?rev=1362663&view=rev
Log:
Ensure stream is closed even if exception occurs, because with current code, there are leaks in callers HTTPHC4Impl, HTTPHC4Impl and HTTPJavaImpl

Modified:
    jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java

Modified: jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java?rev=1362663&r1=1362662&r2=1362663&view=diff
==============================================================================
--- jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java (original)
+++ jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java Tue Jul 17 21:27:42 2012
@@ -43,6 +43,7 @@ import java.util.concurrent.ThreadPoolEx
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
+import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.jmeter.config.Argument;
 import org.apache.jmeter.config.Arguments;
@@ -1577,7 +1578,7 @@ public abstract class HTTPSamplerBase ex
      *
      * For the MD5 case, the result byte count is set to the size of the original response.
      * 
-     * Closes the inputStream (unless there was an error)
+     * Closes the inputStream 
      * 
      * @param sampleResult
      * @param in input stream
@@ -1586,54 +1587,57 @@ public abstract class HTTPSamplerBase ex
      * @throws IOException
      */
     public byte[] readResponse(SampleResult sampleResult, InputStream in, int length) throws IOException {
-
-        byte[] readBuffer = new byte[8192]; // 8kB is the (max) size to have the latency ('the first packet')
-        int bufferSize=32;// Enough for MD5
-
-        MessageDigest md=null;
-        boolean asMD5 = useMD5();
-        if (asMD5) {
-            try {
-                md = MessageDigest.getInstance("MD5"); //$NON-NLS-1$
-            } catch (NoSuchAlgorithmException e) {
-                log.error("Should not happen - could not find MD5 digest", e);
-                asMD5=false;
-            }
-        } else {
-            if (length <= 0) {// may also happen if long value > int.max
-                bufferSize = 4 * 1024;
+        try {
+            byte[] readBuffer = new byte[8192]; // 8kB is the (max) size to have the latency ('the first packet')
+            int bufferSize=32;// Enough for MD5
+    
+            MessageDigest md=null;
+            boolean asMD5 = useMD5();
+            if (asMD5) {
+                try {
+                    md = MessageDigest.getInstance("MD5"); //$NON-NLS-1$
+                } catch (NoSuchAlgorithmException e) {
+                    log.error("Should not happen - could not find MD5 digest", e);
+                    asMD5=false;
+                }
             } else {
-                bufferSize = length;
+                if (length <= 0) {// may also happen if long value > int.max
+                    bufferSize = 4 * 1024;
+                } else {
+                    bufferSize = length;
+                }
             }
-        }
-        ByteArrayOutputStream w = new ByteArrayOutputStream(bufferSize);
-        int bytesRead = 0;
-        int totalBytes = 0;
-        boolean first = true;
-        while ((bytesRead = in.read(readBuffer)) > -1) {
-            if (first) {
+            ByteArrayOutputStream w = new ByteArrayOutputStream(bufferSize);
+            int bytesRead = 0;
+            int totalBytes = 0;
+            boolean first = true;
+            while ((bytesRead = in.read(readBuffer)) > -1) {
+                if (first) {
+                    sampleResult.latencyEnd();
+                    first = false;
+                }
+                if (asMD5 && md != null) {
+                    md.update(readBuffer, 0 , bytesRead);
+                    totalBytes += bytesRead;
+                } else {
+                    w.write(readBuffer, 0, bytesRead);
+                }
+            }
+            if (first){ // Bug 46838 - if there was no data, still need to set latency
                 sampleResult.latencyEnd();
-                first = false;
             }
+            in.close();
+            w.flush();
             if (asMD5 && md != null) {
-                md.update(readBuffer, 0 , bytesRead);
-                totalBytes += bytesRead;
-            } else {
-                w.write(readBuffer, 0, bytesRead);
-            }
-        }
-        if (first){ // Bug 46838 - if there was no data, still need to set latency
-            sampleResult.latencyEnd();
-        }
-        in.close();
-        w.flush();
-        if (asMD5 && md != null) {
-            byte[] md5Result = md.digest();
-            w.write(JOrphanUtils.baToHexBytes(md5Result)); 
-            sampleResult.setBytes(totalBytes);
+                byte[] md5Result = md.digest();
+                w.write(JOrphanUtils.baToHexBytes(md5Result)); 
+                sampleResult.setBytes(totalBytes);
+            }
+            w.close();
+            return w.toByteArray();
+        } finally {
+            IOUtils.closeQuietly(in);
         }
-        w.close();
-        return w.toByteArray();
     }
 
     /**