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/10/04 01:00:54 UTC

svn commit: r701562 - in /incubator/shindig/trunk: config/ features/core.io/ java/common/conf/ java/gadgets/src/main/java/org/apache/shindig/gadgets/ java/gadgets/src/main/java/org/apache/shindig/gadgets/render/ java/gadgets/src/main/java/org/apache/sh...

Author: etnu
Date: Fri Oct  3 16:00:53 2008
New Revision: 701562

URL: http://svn.apache.org/viewvc?rev=701562&view=rev
Log:
Last bit of relative path support.

There are some temporary workarounds for poor url structure in here, identified in shindig 643.


Modified:
    incubator/shindig/trunk/config/container.js
    incubator/shindig/trunk/features/core.io/io.js
    incubator/shindig/trunk/java/common/conf/shindig.properties
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultUrlGenerator.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingContentRewriter.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/lexer/DefaultContentRewriter.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/DefaultUrlGeneratorTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingContentRewriterTest.java

Modified: incubator/shindig/trunk/config/container.js
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/config/container.js?rev=701562&r1=701561&r2=701562&view=diff
==============================================================================
--- incubator/shindig/trunk/config/container.js (original)
+++ incubator/shindig/trunk/config/container.js Fri Oct  3 16:00:53 2008
@@ -77,8 +77,8 @@
 "gadgets.features" : {
   "core.io" : {
     // Note: /proxy is an open proxy. Be careful how you expose this!
-    "proxyUrl" : "proxy?refresh=%refresh%&url=%url%",
-    "jsonProxyUrl" : "makeRequest"
+    "proxyUrl" : "http://%host%/gadgets/proxy?refresh=%refresh%&url=%url%",
+    "jsonProxyUrl" : "http://%host%/gadgets/makeRequest"
   },
   "views" : {
     "profile" : {

Modified: incubator/shindig/trunk/features/core.io/io.js
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/features/core.io/io.js?rev=701562&r1=701561&r2=701562&view=diff
==============================================================================
--- incubator/shindig/trunk/features/core.io/io.js (original)
+++ incubator/shindig/trunk/features/core.io/io.js Fri Oct  3 16:00:53 2008
@@ -354,6 +354,8 @@
         }
       }
 
+      var proxyUrl = config.jsonProxyUrl.replace("%host%", document.location.host);
+
       if (!respondWithPreload(paramData, params, callback, processResponse)) {
         if (httpMethod === "GET" && refreshInterval > 0) {
           // this content should be cached
@@ -361,11 +363,11 @@
           var extraparams = "?refresh=" + refreshInterval + '&'
               + gadgets.io.encodeValues(paramData);
 
-          makeXhrRequest(url, config.jsonProxyUrl + extraparams, callback,
+          makeXhrRequest(url, proxyUrl + extraparams, callback,
               null, "GET", params, processResponse);
 
         } else {
-          makeXhrRequest(url, config.jsonProxyUrl, callback,
+          makeXhrRequest(url, proxyUrl, callback,
               gadgets.io.encodeValues(paramData), "POST", params,
               processResponse);
         }
@@ -442,6 +444,7 @@
       var urlParams = gadgets.util.getUrlParameters();
 
       return config.proxyUrl.replace("%url%", encodeURIComponent(url)).
+          replace("%host%", document.location.host).
           replace("%rawurl%", url).
           replace("%refresh%", encodeURIComponent(refresh)).
           replace("%gadget%", encodeURIComponent(urlParams.url)).

Modified: incubator/shindig/trunk/java/common/conf/shindig.properties
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/common/conf/shindig.properties?rev=701562&r1=701561&r2=701562&view=diff
==============================================================================
--- incubator/shindig/trunk/java/common/conf/shindig.properties (original)
+++ incubator/shindig/trunk/java/common/conf/shindig.properties Fri Oct  3 16:00:53 2008
@@ -1,8 +1,8 @@
 shindig.features.default=res://features/features.txt
 shindig.containers.default=res://containers/default/container.js
 shindig.blacklist.file=
-shindig.urls.iframe.prefix=/gadgets/ifr?
-shindig.urls.js.prefix=/gadgets/js/
+shindig.urls.iframe.prefix=/gadgets/ifr
+shindig.urls.js.prefix=http://%host%/gadgets/js/%js%
 shindig.oauth.state-key=
 shindig.signing.key-name=
 shindig.signing.key-file=
@@ -12,6 +12,8 @@
 shindig.content-rewrite.exclude-urls=
 shindig.content-rewrite.include-tags=link,script,embed,img,style
 shindig.content-rewrite.expires=86400
+shindig.content-rewrite.proxy-url=http://localhost:8080/gadgets/proxy?url=
+shindig.content-rewrite.concat-url=http://localhost:8080/gadgets/concat?
 shindig.cache.capacity=10000
 shindig.gadget-spec.cache.capacity=0
 shindig.message-bundle.cache.capacity=0

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultUrlGenerator.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultUrlGenerator.java?rev=701562&r1=701561&r2=701562&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultUrlGenerator.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultUrlGenerator.java Fri Oct  3 16:00:53 2008
@@ -18,8 +18,9 @@
  */
 package org.apache.shindig.gadgets;
 
+import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.common.uri.UriBuilder;
 import org.apache.shindig.common.util.HashUtil;
-import org.apache.shindig.common.util.Utf8UrlCoder;
 import org.apache.shindig.gadgets.spec.GadgetSpec;
 import org.apache.shindig.gadgets.spec.UserPref;
 import org.apache.shindig.gadgets.spec.View;
@@ -36,6 +37,8 @@
  *
  * TODO: iframe and js url generation are two distinct things, and should probably be different
  * interfaces.
+ *
+ * TODO: iframe and js urls should be able to be generated per container.
  */
 @Singleton
 public class DefaultUrlGenerator implements UrlGenerator {
@@ -61,7 +64,8 @@
   }
 
   public String getBundledJsUrl(Collection<String> features, GadgetContext context) {
-    return jsPrefix + getBundledJsParam(features, context);
+    return jsPrefix.replace("%host%", context.getHost())
+                   .replace("%js%", getBundledJsParam(features, context));
   }
 
   public String getBundledJsParam(Collection<String> features, GadgetContext context) {
@@ -91,7 +95,6 @@
    * consideration!
    */
   public String getIframeUrl(Gadget gadget) {
-    StringBuilder buf = new StringBuilder();
     GadgetContext context = gadget.getContext();
     GadgetSpec spec = gadget.getSpec();
     String url = context.getUrl().toString();
@@ -102,35 +105,32 @@
     } else {
       type = view.getType();
     }
+
+    UriBuilder uri;
     switch (type) {
       case URL:
-        // type = url
-        String href = view.getHref().toString();
-        buf.append(href);
-        if (href.indexOf('?') == -1) {
-          buf.append('?');
-        } else {
-          buf.append('&');
-        }
+        uri = new UriBuilder(view.getHref());
         break;
       case HTML:
       default:
-        buf.append(iframePrefix);
+        // TODO: Locked domain support.
+        uri = new UriBuilder(Uri.parse(iframePrefix));
         break;
     }
-    buf.append("container=").append(context.getContainer());
+
+    uri.addQueryParameter("container", context.getContainer());
     if (context.getModuleId() != 0) {
-      buf.append("&mid=").append(context.getModuleId());
+      uri.addQueryParameter("mid", Integer.toString(context.getModuleId()));
     }
     if (context.getIgnoreCache()) {
-      buf.append("&nocache=1");
+      uri.addQueryParameter("nocache", "1");
     } else {
-      buf.append("&v=").append(spec.getChecksum());
+      uri.addQueryParameter("v", spec.getChecksum());
     }
 
-    buf.append("&lang=").append(context.getLocale().getLanguage());
-    buf.append("&country=").append(context.getLocale().getCountry());
-    buf.append("&view=").append(context.getView());
+    uri.addQueryParameter("lang", context.getLocale().getLanguage());
+    uri.addQueryParameter("country", context.getLocale().getCountry());
+    uri.addQueryParameter("view", context.getView());
 
     UserPrefs prefs = context.getUserPrefs();
     for (UserPref pref : gadget.getSpec().getUserPrefs()) {
@@ -139,15 +139,13 @@
       if (value == null) {
         value = pref.getDefaultValue();
       }
-      buf.append("&up_").append(Utf8UrlCoder.encode(pref.getName()))
-         .append('=').append(Utf8UrlCoder.encode(value));
+      uri.addQueryParameter("up_" + pref.getName(), value);
     }
     // add url last to work around browser bugs
     if(!type.equals(View.ContentType.URL)) {
-        buf.append("&url=")
-           .append(Utf8UrlCoder.encode(url));
-      }
+      uri.addQueryParameter("url", url);
+    }
 
-    return buf.toString();
+    return uri.toString();
   }
 }
\ No newline at end of file

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingContentRewriter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingContentRewriter.java?rev=701562&r1=701561&r2=701562&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingContentRewriter.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingContentRewriter.java Fri Oct  3 16:00:53 2008
@@ -20,6 +20,7 @@
 
 import org.apache.shindig.auth.SecurityToken;
 import org.apache.shindig.common.ContainerConfig;
+import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.gadgets.Gadget;
 import org.apache.shindig.gadgets.GadgetContext;
 import org.apache.shindig.gadgets.GadgetException;
@@ -42,6 +43,7 @@
 import org.apache.shindig.gadgets.spec.LocaleSpec;
 import org.apache.shindig.gadgets.spec.MessageBundle;
 import org.apache.shindig.gadgets.spec.ModulePrefs;
+import org.apache.shindig.gadgets.spec.View;
 
 import com.google.common.collect.Sets;
 import com.google.inject.Inject;
@@ -117,6 +119,7 @@
     try {
       GadgetContent content = createGadgetContent(gadget, mutableContent);
 
+      injectBaseTag(gadget, content);
       injectFeatureLibraries(gadget, content);
       // This can be one script block.
       content.appendHead("<script>");
@@ -134,6 +137,15 @@
     }
   }
 
+  private void injectBaseTag(Gadget gadget, GadgetContent content) {
+    Uri base = gadget.getSpec().getUrl();
+    View view = gadget.getCurrentView();
+    if (view != null && view.getHref() != null) {
+      base = view.getHref();
+    }
+    content.appendHead("<base href='" + base + "'/>");
+  }
+
   private void injectOnLoadHandlers(GadgetContent content) {
     content.appendBody("<script>gadgets.util.runOnLoadHandlers();</script>");
   }
@@ -148,7 +160,7 @@
     GadgetSpec spec = gadget.getSpec();
     String forcedLibs = context.getParameter("libs");
     Set<String> forced;
-    if (forcedLibs == null) {
+    if (forcedLibs == null || forcedLibs.length() == 0) {
       forced = Sets.newHashSet();
     } else {
       forced = Sets.newHashSet(forcedLibs.split(":"));

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/lexer/DefaultContentRewriter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/lexer/DefaultContentRewriter.java?rev=701562&r1=701561&r2=701562&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/lexer/DefaultContentRewriter.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/lexer/DefaultContentRewriter.java Fri Oct  3 16:00:53 2008
@@ -66,17 +66,25 @@
 
   private final Set<String> includeTags;
 
+  private final String proxyUrl;
+
+  private final String concatUrl;
+
   @Inject
   public DefaultContentRewriter(
       GadgetSpecFactory specFactory,
       @Named("shindig.content-rewrite.include-urls")String includeUrls,
       @Named("shindig.content-rewrite.exclude-urls")String excludeUrls,
       @Named("shindig.content-rewrite.expires")String expires,
-      @Named("shindig.content-rewrite.include-tags")String includeTags) {
+      @Named("shindig.content-rewrite.include-tags")String includeTags,
+      @Named("shindig.content-rewrite.proxy-url")String proxyUrl,
+      @Named("shindig.content-rewrite.concat-url")String concatUrl) {
     this.specFactory = specFactory;
     this.includeUrls = includeUrls;
     this.excludeUrls = excludeUrls;
     this.expires = expires;
+    this.proxyUrl = proxyUrl;
+    this.concatUrl = concatUrl;
     this.includeTags = new HashSet<String>();
     for (String s : includeTags.split(",")) {
       if (s != null && s.trim().length() > 0) {
@@ -188,12 +196,14 @@
     return (mime.toLowerCase().contains("css"));
   }
 
+  // TODO: This needs to be per-container
   protected String getProxyUrl() {
-    return "/gadgets/proxy?url=";
+    return proxyUrl;
   }
 
+  // TODO: This needs to be per-container
   protected String getConcatUrl() {
-    return "/gadgets/concat?";
+    return concatUrl;
   }
 
   protected LinkRewriter createLinkRewriter(GadgetSpec spec,

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/DefaultUrlGeneratorTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/DefaultUrlGeneratorTest.java?rev=701562&r1=701561&r2=701562&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/DefaultUrlGeneratorTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/DefaultUrlGeneratorTest.java Fri Oct  3 16:00:53 2008
@@ -31,6 +31,7 @@
 
 import java.net.URI;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -39,19 +40,19 @@
  * Tests for DefaultUrlGenerator.
  */
 public class DefaultUrlGeneratorTest extends GadgetTestFixture {
-  private final static String IFR_PREFIX = "shindig/eye-frame?";
-  private final static String JS_PREFIX = "get-together/livescript/";
-  private final static String SPEC_URL = "http://example.org/gadget.xml";
-  private final static String TYPE_URL_HREF_HOST = "opensocial.org";
-  private final static String TYPE_URL_HREF_PATH = "/app/foo";
-  private final static String TYPE_URL_HREF_QUERY = "foo=bar&bar=baz";
-  private final static String TYPE_URL_HREF
+  private static final String IFR_PREFIX = "shindig/eye-frame";
+  private static final String JS_PREFIX = "http://%host%/get-together/livescript/%js%";
+  private static final String SPEC_URL = "http://example.org/gadget.xml";
+  private static final String TYPE_URL_HREF_HOST = "opensocial.org";
+  private static final String TYPE_URL_HREF_PATH = "/app/foo";
+  private static final String TYPE_URL_HREF_QUERY = "foo=bar&bar=baz";
+  private static final String TYPE_URL_HREF
       = "http://" + TYPE_URL_HREF_HOST + TYPE_URL_HREF_PATH + '?' + TYPE_URL_HREF_QUERY;
-  private final static String UP_NAME = "user-pref-name";
-  private final static String UP_VALUE = "user-pref-value";
-  private final static String CONTAINER = "shindig";
-  private final static String VIEW = "canvas";
-  private final static int MODULE_ID = 3435;
+  private static final String UP_NAME = "user-pref-name";
+  private static final String UP_VALUE = "user-pref-value";
+  private static final String CONTAINER = "shindig";
+  private static final String VIEW = "canvas";
+  private static final int MODULE_ID = 3435;
 
   private final GadgetContext context = mock(GadgetContext.class);
   private DefaultUrlGenerator realUrlGenerator;
@@ -107,14 +108,20 @@
   }
 
   public void testGetBundledJsUrl() throws Exception {
-    List<String> features = new ArrayList<String>();
+    List<String> features = Arrays.asList("foo", "bar");
     expect(context.getDebug()).andReturn(false);
+    expect(context.getHost()).andReturn("example.org");
     replay();
 
     String jsParam = realUrlGenerator.getBundledJsUrl(features, context);
 
-    assertTrue(jsParam.matches(
-        JS_PREFIX + "core\\.js\\?v=[0-9a-zA-Z]*&container=" + CONTAINER + "&debug=0"));
+    Uri uri = Uri.parse(jsParam);
+
+    assertEquals("example.org", uri.getAuthority());
+    assertEquals("/get-together/livescript/foo:bar.js", uri.getPath());
+    assertTrue("Missing checksum.", uri.getQueryParameter("v").matches("[0-9a-zA-Z]*"));
+    assertEquals(CONTAINER, uri.getQueryParameter("container"));
+    assertEquals("0", uri.getQueryParameter("debug"));
   }
 
   public void testGetIframeUrlTypeHtml() throws Exception {
@@ -132,13 +139,13 @@
         .setSpec(spec)
         .setCurrentView(spec.getView("default"));
 
-    URI iframeUrl = URI.create(realUrlGenerator.getIframeUrl(gadget));
+    Uri iframeUrl = Uri.parse(realUrlGenerator.getIframeUrl(gadget));
 
-    assertEquals(IFR_PREFIX, iframeUrl.getPath() + '?');
-    StringAssert.assertContains("container=" + CONTAINER, iframeUrl.getQuery());
-    StringAssert.assertContains("up_" + UP_NAME + '=' + UP_VALUE, iframeUrl.getQuery());
-    StringAssert.assertContains("mid=" + MODULE_ID, iframeUrl.getQuery());
-    StringAssert.assertContains("view=" + VIEW, iframeUrl.getQuery());
+    assertEquals(IFR_PREFIX, iframeUrl.getPath());
+    assertEquals(CONTAINER, iframeUrl.getQueryParameter("container"));
+    assertEquals(UP_VALUE, iframeUrl.getQueryParameter("up_" + UP_NAME));
+    assertEquals(Integer.toString(MODULE_ID), iframeUrl.getQueryParameter("mid"));
+    assertEquals(VIEW, iframeUrl.getQueryParameter("view"));
   }
 
   public void testGetIframeUrlTypeUrl() throws Exception {

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingContentRewriterTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingContentRewriterTest.java?rev=701562&r1=701561&r2=701562&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingContentRewriterTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingContentRewriterTest.java Fri Oct  3 16:00:53 2008
@@ -30,6 +30,7 @@
 
 import org.apache.shindig.common.ContainerConfig;
 import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.common.xml.XmlUtil;
 import org.apache.shindig.gadgets.Gadget;
 import org.apache.shindig.gadgets.GadgetContext;
 import org.apache.shindig.gadgets.GadgetException;
@@ -46,6 +47,7 @@
 import org.apache.shindig.gadgets.spec.GadgetSpec;
 import org.apache.shindig.gadgets.spec.LocaleSpec;
 import org.apache.shindig.gadgets.spec.MessageBundle;
+import org.apache.shindig.gadgets.spec.View;
 
 import com.google.caja.util.Join;
 import com.google.common.collect.Lists;
@@ -563,6 +565,45 @@
     assertEquals(0, json.length());
   }
 
+  private String getBaseElement(String content) {
+    Matcher matcher = DOCUMENT_SPLIT_PATTERN.matcher(content);
+    assertTrue("Output is not valid HTML.", matcher.matches());
+    Pattern baseElementPattern
+        = Pattern.compile("(?:.*)<base href='(.*?)'\\/>(?:.*)", Pattern.DOTALL);
+    Matcher baseElementMatcher = baseElementPattern.matcher(matcher.group(HEAD_GROUP));
+    assertTrue("base element missing from head of document.", baseElementMatcher.matches());
+    return baseElementMatcher.group(1);
+  }
+
+  @Test
+  public void baseElementInsertedWhenContentIsInline() throws Exception {
+    Gadget gadget = makeDefaultGadget();
+
+    control.replay();
+
+    String rewritten = rewrite(gadget, BODY_CONTENT);
+    String base = getBaseElement(rewritten);
+
+    assertEquals(SPEC_URL.toString(), base);
+  }
+
+  @Test
+  public void baseElementInsertedWhenContentIsProxied() throws Exception {
+    Gadget gadget = makeDefaultGadget();
+
+    String viewUrl = "http://example.org/view.html";
+    String xml = "<Content href='" + viewUrl + "'/>";
+    View fakeView = new View("foo", Arrays.asList(XmlUtil.parse(xml)), SPEC_URL);
+    gadget.setCurrentView(fakeView);
+
+    control.replay();
+
+    String rewritten = rewrite(gadget, BODY_CONTENT);
+    String base = getBaseElement(rewritten);
+
+    assertEquals(viewUrl, base);
+  }
+
   /**
    * Simple message bundle factory -- only honors inline bundles.
    */