Improve error message when a RequestFactory 2.3 request is received.
Issue 6628.
http://gwt-code-reviews.appspot.com/1503803/
Patch by: bobv
Review by: rjrjr


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@10482 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/web/bindery/requestfactory/server/SimpleRequestProcessor.java b/user/src/com/google/web/bindery/requestfactory/server/SimpleRequestProcessor.java
index 078ad2a..b84b3d6 100644
--- a/user/src/com/google/web/bindery/requestfactory/server/SimpleRequestProcessor.java
+++ b/user/src/com/google/web/bindery/requestfactory/server/SimpleRequestProcessor.java
@@ -126,7 +126,6 @@
     try {
       process(req, responseBean.as());
     } catch (ReportableException e) {
-      e.printStackTrace();
       // Create a new response envelope, since the state is unknown
       responseBean = FACTORY.response();
       responseBean.as().setGeneralFailure(createFailureMessage(e).as());
@@ -200,7 +199,12 @@
     final RequestState source = new RequestState(service);
 
     // Make sure the RequestFactory is valid
-    service.resolveRequestFactory(req.getRequestFactory());
+    String requestFactoryToken = req.getRequestFactory();
+    if (requestFactoryToken == null) {
+      // Tell old clients to go away
+      throw new ReportableException("The client payload version is out of sync with the server");
+    }
+    service.resolveRequestFactory(requestFactoryToken);
 
     // Apply operations
     processOperationMessages(source, req);
diff --git a/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTest.java b/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTest.java
index fdff661..9bcbc55 100644
--- a/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTest.java
+++ b/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTest.java
@@ -15,6 +15,7 @@
  */
 package com.google.web.bindery.requestfactory.gwt.client;
 
+import com.google.web.bindery.autobean.shared.AutoBeanCodex;
 import com.google.web.bindery.requestfactory.shared.EntityProxy;
 import com.google.web.bindery.requestfactory.shared.EntityProxyChange;
 import com.google.web.bindery.requestfactory.shared.EntityProxyId;
@@ -23,6 +24,8 @@
 import com.google.web.bindery.requestfactory.shared.Receiver;
 import com.google.web.bindery.requestfactory.shared.Request;
 import com.google.web.bindery.requestfactory.shared.RequestContext;
+import com.google.web.bindery.requestfactory.shared.RequestTransport;
+import com.google.web.bindery.requestfactory.shared.RequestTransport.TransportReceiver;
 import com.google.web.bindery.requestfactory.shared.ServerFailure;
 import com.google.web.bindery.requestfactory.shared.SimpleBarProxy;
 import com.google.web.bindery.requestfactory.shared.SimpleBarRequest;
@@ -31,7 +34,10 @@
 import com.google.web.bindery.requestfactory.shared.SimpleFooRequest;
 import com.google.web.bindery.requestfactory.shared.SimpleValueContext;
 import com.google.web.bindery.requestfactory.shared.SimpleValueProxy;
+import com.google.web.bindery.requestfactory.shared.impl.MessageFactoryHolder;
 import com.google.web.bindery.requestfactory.shared.impl.SimpleEntityProxyId;
+import com.google.web.bindery.requestfactory.shared.messages.ResponseMessage;
+import com.google.web.bindery.requestfactory.shared.messages.ServerFailureMessage;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
@@ -565,6 +571,49 @@
   }
 
   /**
+   * Tests the server behavior when an empty JSON object is sent.
+   */
+  public void testEmptyRequestBlankObject() {
+    delayTestFinish(DELAY_TEST_FINISH);
+    RequestTransport transport = req.getRequestTransport();
+    transport.send("{}", new TransportReceiver() {
+      @Override
+      public void onTransportFailure(ServerFailure failure) {
+        fail();
+      }
+
+      @Override
+      public void onTransportSuccess(String payload) {
+        ResponseMessage resp =
+            AutoBeanCodex.decode(MessageFactoryHolder.FACTORY, ResponseMessage.class, payload).as();
+        ServerFailureMessage failure = resp.getGeneralFailure();
+        assertNotNull(failure);
+        finishTestAndReset();
+      }
+    });
+  }
+
+  /**
+   * Tests the server behavior when a zero-length payload is sent.
+   */
+  public void testEmptyRequestZeroLength() {
+    delayTestFinish(DELAY_TEST_FINISH);
+    RequestTransport transport = req.getRequestTransport();
+    transport.send("", new TransportReceiver() {
+      @Override
+      public void onTransportFailure(ServerFailure failure) {
+        // Expect a 500 since the payload is malformed
+        finishTestAndReset();
+      }
+
+      @Override
+      public void onTransportSuccess(String payload) {
+        fail("Should not have succeeded");
+      }
+    });
+  }
+
+  /**
    * Tests that enum values used only as method parameters in a RequestContext
    * are in the EnumMap. This test only applies to GWT-based clients.
    */