THRIFT-601. java: Allow a maximum frame size for TFramedTransport

git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@938205 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/java/src/org/apache/thrift/transport/TFramedTransport.java b/lib/java/src/org/apache/thrift/transport/TFramedTransport.java
index 1387ac1..fab9c9b 100644
--- a/lib/java/src/org/apache/thrift/transport/TFramedTransport.java
+++ b/lib/java/src/org/apache/thrift/transport/TFramedTransport.java
@@ -27,6 +27,10 @@
  */
 public class TFramedTransport extends TTransport {
 
+  protected static final int DEFAULT_MAX_LENGTH = 0x7FFFFFFF;
+
+  private int maxLength_;
+
   /**
    * Underlying transport
    */
@@ -44,19 +48,32 @@
   private TMemoryInputTransport readBuffer_ = new TMemoryInputTransport(new byte[0]);
 
   public static class Factory extends TTransportFactory {
+    private int maxLength_;
+
     public Factory() {
+      maxLength_ = TFramedTransport.DEFAULT_MAX_LENGTH;
+    }
+
+    public Factory(int maxLength) {
+      maxLength_ = maxLength;
     }
 
     public TTransport getTransport(TTransport base) {
-      return new TFramedTransport(base);
+      return new TFramedTransport(base, maxLength_);
     }
   }
 
   /**
    * Constructor wraps around another tranpsort
    */
+  public TFramedTransport(TTransport transport, int maxLength) {
+    transport_ = transport;
+    maxLength_ = maxLength;
+  }
+
   public TFramedTransport(TTransport transport) {
     transport_ = transport;
+    maxLength_ = TFramedTransport.DEFAULT_MAX_LENGTH;
   }
 
   public void open() throws TTransportException {
@@ -118,6 +135,10 @@
       throw new TTransportException("Read a negative frame size (" + size + ")!");
     }
 
+    if (size > maxLength_) {
+      throw new TTransportException("Frame size (" + size + ") larger than max length (" + maxLength_ + ")!");
+    }
+
     byte[] buff = new byte[size];
     transport_.readAll(buff, 0, size);
     readBuffer_.reset(buff);