You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by ol...@apache.org on 2006/12/16 15:14:16 UTC

svn commit: r487802 - /jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/HttpMethodBase.java

Author: olegk
Date: Sat Dec 16 06:14:16 2006
New Revision: 487802

URL: http://svn.apache.org/viewvc?view=rev&rev=487802
Log:
* Small tweaks to the original Odi's patch
* Added #getResponseBody(int) method for consistency

Modified:
    jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/HttpMethodBase.java

Modified: jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/HttpMethodBase.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/HttpMethodBase.java?view=diff&rev=487802&r1=487801&r2=487802
==============================================================================
--- jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/HttpMethodBase.java (original)
+++ jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/HttpMethodBase.java Sat Dec 16 06:14:16 2006
@@ -34,9 +34,7 @@
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.InputStreamReader;
 import java.io.InterruptedIOException;
-import java.io.Reader;
 import java.util.Collection;
 
 import org.apache.commons.httpclient.auth.AuthState;
@@ -699,6 +697,63 @@
     }
 
     /**
+     * Returns the response body of the HTTP method, if any, as an array of bytes.
+     * If response body is not available or cannot be read, returns <tt>null</tt>
+     * 
+     * Note: This will cause the entire response body to be buffered in memory. This method is
+     * safe if the content length of the response is unknown, because the amount of memory used
+     * is limited.<p>
+     * 
+     * If the response is large this method involves lots of array copying and many object 
+     * allocations, which makes it unsuitable for high-performance / low-footprint applications.
+     * Those applications should use {@link #getResponseBodyAsStream()}.
+     * 
+     * @param maxlen the maximum content length to accept (number of bytes). 
+     * @return The response body.
+     * 
+     * @throws IOException If an I/O (transport) problem occurs while obtaining the 
+     * response body.
+     */
+    public byte[] getResponseBody(int maxlen) throws IOException {
+        if (maxlen < 0) throw new IllegalArgumentException("maxlen must be positive");
+        if (this.responseBody == null) {
+            InputStream instream = getResponseBodyAsStream();
+            if (instream != null) {
+                // we might already know that the content is larger
+                long contentLength = getResponseContentLength();
+                if ((contentLength != -1) && (contentLength > maxlen)) {
+                    throw new HttpContentTooLargeException(
+                            "Content-Length is " + contentLength, maxlen);
+                }
+                
+                LOG.debug("Buffering response body");
+                ByteArrayOutputStream rawdata = new ByteArrayOutputStream(
+                        contentLength > 0 ? (int) contentLength : DEFAULT_INITIAL_BUFFER_SIZE);
+                byte[] buffer = new byte[2048];
+                int pos = 0;
+                int len;
+                do {
+                    len = instream.read(buffer, 0, Math.min(buffer.length, maxlen-pos));
+                    if (len == -1) break;
+                    rawdata.write(buffer, 0, len);
+                    pos += len;
+                } while (pos < maxlen);
+                
+                setResponseStream(null);
+                // check if there is even more data
+                if (pos == maxlen) {
+                    if (instream.read() != -1)
+                        throw new HttpContentTooLargeException(
+                                "Content-Length not known but larger than "
+                                + maxlen, maxlen);
+                }
+                this.responseBody = rawdata.toByteArray();
+            }
+        }
+        return this.responseBody;
+    }
+
+    /**
      * Returns the response body of the HTTP method, if any, as an {@link InputStream}. 
      * If response body is not available, returns <tt>null</tt>
      * 
@@ -770,36 +825,15 @@
      */
     public String getResponseBodyAsString(int maxlen) throws IOException {
         if (maxlen < 0) throw new IllegalArgumentException("maxlen must be positive");
-        
-        // we might already know that the content is larger
-        long contentLength = getResponseContentLength();
-        if ((contentLength != -1) && (contentLength > maxlen)) {
-            throw new HttpContentTooLargeException("Content-Length is "+ contentLength, maxlen);
+        byte[] rawdata = null;
+        if (responseAvailable()) {
+            rawdata = getResponseBody(maxlen);
         }
-        
-        LOG.debug("Buffering response body");
-        ByteArrayOutputStream rawdata = new ByteArrayOutputStream(
-                contentLength > 0 ? (int) contentLength : DEFAULT_INITIAL_BUFFER_SIZE);
-        InputStream in = getResponseBodyAsStream();
-        if (in == null) return null;
-        byte[] buffer = new byte[2048];
-        int pos = 0;
-        int len;
-        do {
-            len = in.read(buffer, 0, Math.min(buffer.length, maxlen-pos));
-            if (len == -1) break;
-            rawdata.write(buffer, 0, len);
-            pos += len;
-        } while (pos < maxlen);
-        
-        // check if there is even more data
-        if (pos == maxlen) {
-            if (in.read() != -1)
-                throw new HttpContentTooLargeException("Content-Length not known but larger than "
-                        + maxlen, maxlen);
+        if (rawdata != null) {
+            return EncodingUtil.getString(rawdata, getResponseCharSet());
+        } else {
+            return null;
         }
-        
-        return EncodingUtil.getString(rawdata.toByteArray(), 0, pos, getResponseCharSet());
     }
 
     /**



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org