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.
*/