You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@abdera.apache.org by jm...@apache.org on 2006/08/22 06:35:22 UTC

svn commit: r433505 - /incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/util/BaseRequestEntity.java

Author: jmsnell
Date: Mon Aug 21 21:35:22 2006
New Revision: 433505

URL: http://svn.apache.org/viewvc?rev=433505&view=rev
Log:
The old implementation always used chunked requests.  Some proxies and servers, however,
require the Content-Length header and no chunking of the request.  Add a flag to the
BaseRequestEntity utility class to enable non-chunked requests.

Modified:
    incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/util/BaseRequestEntity.java

Modified: incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/util/BaseRequestEntity.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/util/BaseRequestEntity.java?rev=433505&r1=433504&r2=433505&view=diff
==============================================================================
--- incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/util/BaseRequestEntity.java (original)
+++ incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/util/BaseRequestEntity.java Mon Aug 21 21:35:22 2006
@@ -17,6 +17,7 @@
 */
 package org.apache.abdera.protocol.util;
 
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 
@@ -34,22 +35,53 @@
 public class BaseRequestEntity 
   implements RequestEntity {
 
-  Base base = null;
+  private Base base = null;
+  private byte[] buf = null;
+  private boolean use_chunked = true;
   
   public BaseRequestEntity(Base base) {
     this.base = base;
   }
   
+  public BaseRequestEntity(Base base, boolean use_chunked) {
+    this(base);
+    this.use_chunked = use_chunked;
+  }
+  
   public boolean isRepeatable() {
     return true;
   }
 
   public void writeRequest(OutputStream out) throws IOException {
-    base.writeTo(out);
+    if (use_chunked)
+      base.writeTo(out);
+    else {
+      // if we're not using chunked requests, the getContentLength method
+      // has likely already been called and we want to just go ahead and
+      // use the buffered output rather than reserialize
+      if (buf == null) getContentLength();  // ensures that the content is buffered
+      out.write(buf);
+      out.flush();
+    }
   }
 
   public long getContentLength() {
-    return -1;  // chunk the response
+    if (use_chunked)
+      return -1;  // chunk the response
+    else {
+      // this is ugly, but some proxies and server configurations (e.g. gdata)
+      // require that requests contain the Content-Length header.  The only
+      // way to get that is to serialize the document into a byte array, which
+      // we buffer into memory.
+      if (buf == null) {
+        try {
+          ByteArrayOutputStream out = new ByteArrayOutputStream();
+          base.writeTo(out);
+          buf = out.toByteArray();
+        } catch (Exception e) {}
+      }
+      return buf.length;
+    }
   }
 
   public String getContentType() {