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;
}