You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by et...@apache.org on 2008/09/18 21:51:16 UTC

svn commit: r696781 - in /incubator/shindig/trunk/java/gadgets/src: main/java/org/apache/shindig/gadgets/render/Renderer.java test/java/org/apache/shindig/gadgets/preload/HttpPreloaderTest.java test/java/org/apache/shindig/gadgets/render/RendererTest.java

Author: etnu
Date: Thu Sep 18 12:51:16 2008
New Revision: 696781

URL: http://svn.apache.org/viewvc?rev=696781&view=rev
Log:
Added authenticated proxied requests (SHINDIG-523).

Remaining work items:

- Perform rewriting.
- Swap Renderer in place of GadgetRenderingTask (and associated temporary classes).

Nice to have, but usable without:

- Transitive link proxying.
- Relative urls.

The last items can be done after we swap out the rendering pipeline. The relative url thing should be really easy to take care of, though the transitive link proxying will be a bit more complicated.


Modified:
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/Renderer.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/HttpPreloaderTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RendererTest.java

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/Renderer.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/Renderer.java?rev=696781&r1=696780&r2=696781&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/Renderer.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/Renderer.java Thu Sep 18 12:51:16 2008
@@ -23,9 +23,10 @@
 import org.apache.shindig.gadgets.GadgetException;
 import org.apache.shindig.gadgets.GadgetSpecFactory;
 import org.apache.shindig.gadgets.ProcessedGadget;
-import org.apache.shindig.gadgets.http.HttpFetcher;
+import org.apache.shindig.gadgets.http.ContentFetcherFactory;
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
+import org.apache.shindig.gadgets.oauth.OAuthArguments;
 import org.apache.shindig.gadgets.preload.PreloaderService;
 import org.apache.shindig.gadgets.spec.GadgetSpec;
 import org.apache.shindig.gadgets.spec.View;
@@ -37,15 +38,15 @@
  */
 public class Renderer {
   private final GadgetSpecFactory gadgetSpecFactory;
-  private final HttpFetcher httpFetcher;
+  private final ContentFetcherFactory fetcher;
   private final PreloaderService preloader;
 
   @Inject
   public Renderer(GadgetSpecFactory gadgetSpecFactory,
-                  HttpFetcher httpFetcher,
+                  ContentFetcherFactory fetcher,
                   PreloaderService preloader) {
     this.gadgetSpecFactory = gadgetSpecFactory;
-    this.httpFetcher = httpFetcher;
+    this.fetcher = fetcher;
     this.preloader = preloader;
   }
 
@@ -79,13 +80,17 @@
 
       gadget.setPreloads(preloader.preload(context, spec));
 
-      // TODO: Add current url to GadgetContext to support transitive proxying.
-
       if (view.getHref() == null) {
         return view.getContent();
       } else {
-        HttpRequest request = new HttpRequest(Uri.fromJavaUri(view.getHref()));
-        HttpResponse response = httpFetcher.fetch(request);
+        // TODO: Add current url to GadgetContext to support transitive proxying.
+        HttpRequest request = new HttpRequest(Uri.fromJavaUri(view.getHref()))
+            .setSecurityToken(context.getToken())
+            .setOAuthArguments(new OAuthArguments(view))
+            .setAuthType(view.getAuthType())
+            .setContainer(context.getContainer())
+            .setGadget(Uri.fromJavaUri(context.getUrl()));
+        HttpResponse response = fetcher.fetch(request);
         return response.getResponseAsString();
       }
     } catch (GadgetException e) {

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/HttpPreloaderTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/HttpPreloaderTest.java?rev=696781&r1=696780&r2=696781&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/HttpPreloaderTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/HttpPreloaderTest.java Thu Sep 18 12:51:16 2008
@@ -36,11 +36,8 @@
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 
-import org.easymock.IMocksControl;
-import org.easymock.classextension.EasyMock;
 import org.json.JSONException;
 import org.json.JSONObject;
-import org.junit.Before;
 import org.junit.Test;
 
 import java.net.URI;
@@ -188,7 +185,7 @@
   }
 
   private static class RecordingHttpFetcher implements HttpFetcher {
-    private List<HttpRequest> requests = Lists.newArrayList();
+    private final List<HttpRequest> requests = Lists.newArrayList();
 
     public HttpResponse fetch(HttpRequest request) {
       requests.add(request);

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RendererTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RendererTest.java?rev=696781&r1=696780&r2=696781&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RendererTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RendererTest.java Thu Sep 18 12:51:16 2008
@@ -21,11 +21,13 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
+import org.apache.shindig.auth.AnonymousSecurityToken;
+import org.apache.shindig.auth.SecurityToken;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.gadgets.GadgetContext;
 import org.apache.shindig.gadgets.GadgetException;
 import org.apache.shindig.gadgets.GadgetSpecFactory;
-import org.apache.shindig.gadgets.http.HttpFetcher;
+import org.apache.shindig.gadgets.http.ContentFetcherFactory;
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.preload.PreloaderService;
@@ -52,13 +54,17 @@
       " <ModulePrefs title='foo'/>" +
       " <Content view='html' type='html'>" + BASIC_HTML_CONTENT + "</Content>" +
       " <Content view='proxied' type='html' href='" + PROXIED_HTML_HREF + "'/>" +
+      " <Content view='proxied-signed' authz='signed' href='" + PROXIED_HTML_HREF + "'/>" +
+      " <Content view='proxied-oauth' authz='oauth' href='" + PROXIED_HTML_HREF + "'/>" +
       " <Content view='url' type='url' href='http://example.org/always/an/error.html'/>" +
       "</Module>";
 
   private final FakeGadgetSpecFactory specFactory = new FakeGadgetSpecFactory();
-  private final FakeHttpFetcher httpFetcher = new FakeHttpFetcher();
+
+  private final FakeContentFetcherFactory fetcher = new FakeContentFetcherFactory();
+
   private final FakePreloaderService preloaderService = new FakePreloaderService();
-  private final Renderer renderer = new Renderer(specFactory, httpFetcher, preloaderService);
+  private final Renderer renderer = new Renderer(specFactory, fetcher, preloaderService);
 
   private GadgetContext makeContext(final String view, final Uri specUrl) {
     return new GadgetContext() {
@@ -71,6 +77,11 @@
       public String getView() {
         return view;
       }
+
+      @Override
+      public SecurityToken getToken() {
+        return new AnonymousSecurityToken();
+      }
     };
   }
 
@@ -82,7 +93,7 @@
 
   @Test
   public void renderProxiedTypeHtml() throws Exception {
-    httpFetcher.responses.put(PROXIED_HTML_HREF, new HttpResponse(PROXIED_HTML_CONTENT));
+    fetcher.plainResponses.put(PROXIED_HTML_HREF, new HttpResponse(PROXIED_HTML_CONTENT));
     String content = renderer.render(makeContext("proxied", SPEC_URL));
     assertEquals(PROXIED_HTML_CONTENT, content);
   }
@@ -98,11 +109,25 @@
   }
 
   @Test
-  public void doPreloading() throws Exception {
+  public void doPreloading() throws RenderingException {
     renderer.render(makeContext("html", SPEC_URL));
     assertTrue("Preloading not performed.", preloaderService.wasPreloaded);
   }
 
+  @Test
+  public void renderProxiedSigned() throws RenderingException {
+    fetcher.oauthResponses.put(PROXIED_HTML_HREF, new HttpResponse(PROXIED_HTML_CONTENT));
+    String content = renderer.render(makeContext("proxied-signed", SPEC_URL));
+    assertEquals(PROXIED_HTML_CONTENT, content);
+  }
+
+  @Test
+  public void renderProxiedOAuth() throws RenderingException {
+    fetcher.oauthResponses.put(PROXIED_HTML_HREF, new HttpResponse(PROXIED_HTML_CONTENT));
+    String content = renderer.render(makeContext("proxied-oauth", SPEC_URL));
+    assertEquals(PROXIED_HTML_CONTENT, content);
+  }
+
   private static class FakeGadgetSpecFactory implements GadgetSpecFactory {
     public GadgetSpec getGadgetSpec(GadgetContext context) throws GadgetException {
       return new GadgetSpec(context.getUrl(), GADGET);
@@ -113,14 +138,52 @@
     }
   }
 
-  private static class FakeHttpFetcher implements HttpFetcher {
-    private final Map<Uri, HttpResponse> responses = Maps.newHashMap();
+  private static class FakeContentFetcherFactory extends ContentFetcherFactory {
+    private final Map<Uri, HttpResponse> plainResponses = Maps.newHashMap();
+    private final Map<Uri, HttpResponse> oauthResponses = Maps.newHashMap();
+
+    public FakeContentFetcherFactory() {
+      super(null, null);
+    }
 
+    @Override
     public HttpResponse fetch(HttpRequest request) throws GadgetException {
-      HttpResponse response = responses.get(request.getUri());
+      if (request.getGadget() == null) {
+        throw new GadgetException(GadgetException.Code.FAILED_TO_RETRIEVE_CONTENT,
+            "No gadget associated with rendering request.");
+      }
+
+      if (request.getContainer() == null) {
+        throw new GadgetException(GadgetException.Code.FAILED_TO_RETRIEVE_CONTENT,
+            "No container associated with rendering request.");
+      }
+
+      if (request.getSecurityToken() == null) {
+        throw new GadgetException(GadgetException.Code.FAILED_TO_RETRIEVE_CONTENT,
+            "No security token associated with rendering request.");
+      }
+
+      if (request.getOAuthArguments() == null) {
+        throw new GadgetException(GadgetException.Code.FAILED_TO_RETRIEVE_CONTENT,
+            "No oauth arguments associated with rendering request.");
+      }
+
+      HttpResponse response;
+      switch (request.getAuthType()) {
+        case NONE:
+          response = plainResponses.get(request.getUri());
+          break;
+        case SIGNED:
+        case OAUTH:
+          response = oauthResponses.get(request.getUri());
+          break;
+        default:
+          response = null;
+          break;
+      }
       if (response == null) {
         throw new GadgetException(GadgetException.Code.FAILED_TO_RETRIEVE_CONTENT,
-            "Unknown gadget: " + request.getUri());
+            "Unknown file: " + request.getUri());
       }
       return response;
     }