Author: awiner
Date: Fri Jun  5 20:34:30 2009
New Revision: 782126

URL: http://svn.apache.org/viewvc?rev=782126&view=rev
Log:
SHINDIG-1082: Logged (but dropped) exception when data pipelining can't find a 
social token
- Handle missing tokens explicitly in social data pipelining loads

Modified:
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PipelinedDataPreloader.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/PipelinedDataPreloaderTest.java

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PipelinedDataPreloader.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PipelinedDataPreloader.java?rev=782126&r1=782125&r2=782126&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PipelinedDataPreloader.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PipelinedDataPreloader.java
 Fri Jun  5 20:34:30 2009
@@ -30,6 +30,7 @@
 import org.apache.shindig.gadgets.GadgetException;
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
+import org.apache.shindig.gadgets.http.HttpResponseBuilder;
 import org.apache.shindig.gadgets.http.RequestPipeline;
 import org.apache.shindig.gadgets.spec.PipelinedData;
 import org.apache.shindig.gadgets.spec.RequestAuthenticationInfo;
@@ -43,6 +44,8 @@
 import java.util.Set;
 import java.util.concurrent.Callable;
 
+import javax.servlet.http.HttpServletResponse;
+
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
@@ -116,20 +119,30 @@
     }
 
     public PreloadedData call() throws Exception {
-      Uri uri = getSocialUri(context);
+      HttpResponse response;
+      
+      String token = context.getParameter("st");
+      if (token == null) {
+        response = new HttpResponseBuilder()
+           .setHttpStatusCode(HttpServletResponse.SC_FORBIDDEN)
+           .setResponseString("Security token missing")
+           .create();
+      } else {
+        Uri uri = getSocialUri(context, token);
 
-      String socialRequestsJson = JsonSerializer.serialize(socialRequests);
-      HttpRequest request = new HttpRequest(uri)
-          .setIgnoreCache(context.getIgnoreCache())
-          .setSecurityToken(context.getToken())
-          .setMethod("POST")
-          .setAuthType(AuthType.NONE)
-          .setPostBody(CharsetUtil.getUtf8Bytes(socialRequestsJson))
-          .addHeader("Content-Type", "application/json; charset=UTF-8")
-          .setContainer(context.getContainer())
-          .setGadget(context.getUrl());
+        String socialRequestsJson = JsonSerializer.serialize(socialRequests);
+        HttpRequest request = new HttpRequest(uri)
+            .setIgnoreCache(context.getIgnoreCache())
+            .setSecurityToken(context.getToken())
+            .setMethod("POST")
+            .setAuthType(AuthType.NONE)
+            .setPostBody(CharsetUtil.getUtf8Bytes(socialRequestsJson))
+            .addHeader("Content-Type", "application/json; charset=UTF-8")
+            .setContainer(context.getContainer())
+            .setGadget(context.getUrl());
 
-      HttpResponse response = executeSocialRequest(request);
+        response = executeSocialRequest(request);
+      }
 
       // Unpack the response into a list of PreloadedData responses
       String responseText;
@@ -340,13 +353,14 @@
     return error;
   }
 
-  private Uri getSocialUri(GadgetContext context) {
+  private Uri getSocialUri(GadgetContext context, String token) {
     String jsonUri = config.getString(context.getContainer(), 
"gadgets.osDataUri");
     Preconditions.checkNotNull(jsonUri, "No JSON URI available for social 
preloads");
+    Preconditions.checkNotNull(token, "No token available for social 
preloads");
 
     UriBuilder builder = UriBuilder.parse(
         jsonUri.replace("%host%", context.getHost()))
-        .addQueryParameter("st", context.getParameter("st"));
+        .addQueryParameter("st", token);
     return builder.toUri();
   }
 }

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/PipelinedDataPreloaderTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/PipelinedDataPreloaderTest.java?rev=782126&r1=782125&r2=782126&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/PipelinedDataPreloaderTest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/PipelinedDataPreloaderTest.java
 Fri Jun  5 20:34:30 2009
@@ -218,6 +218,33 @@
     JsonAssert.assertJsonEquals(resultWithKeyP.toString(), 
resultsById.get("p"));
   }
 
+  @Test
+  /** 
+   * Verify that social preloads where the request doesn't contain a token
+   * serve up 403s for the preloaded data, instead of failing the whole 
request.
+   */
+  public void testSocialPreloadWithoutToken() throws Exception {
+    GadgetSpec spec = new GadgetSpec(GADGET_URL, XML);
+    
+    RecordingRequestPipeline pipeline = new RecordingRequestPipeline("");
+    PipelinedDataPreloader preloader = new PipelinedDataPreloader(pipeline, 
containerConfig);
+    view = "profile";
+    // But don't set the security token
+
+    Gadget gadget = new Gadget()
+        .setContext(context)
+        .setSpec(spec)
+        .setCurrentView(spec.getView("profile"));
+    PipelinedData.Batch batch = getBatch(gadget);
+    Collection<Callable<PreloadedData>> tasks = preloader.createPreloadTasks(
+        context, batch);
+    PreloadedData data = tasks.iterator().next().call();
+    JsonAssert.assertObjectEquals(
+        "[{error:{code:403,data:{content:\"Security token 
missing\"}},id:\"a\"}," +
+        "{error:{code:403,data:{content:\"Security token 
missing\"}},id:\"p\"}]",
+        data.toJson());
+  }
+
   private Map<String, String> getResultsById(Collection<Object> result) {
     Map<String, String> resultsById = Maps.newHashMap();
     for (Object o : result) {


Reply via email to