http://svn.apache.org/viewvc?rev=1102885&view=rev
<http://svn.apache.org/viewvc?rev=1102885&view=rev>I'd be happy to work w/ you on moving the logic to ContainerConfig. --j On Fri, May 13, 2011 at 1:12 PM, John Hjelmstad <[email protected]> wrote: > Hi all, > > This CL unfortunately suffers from a lot of static cling. There's no way to > customize this behavior, and the default behavior ends up having odd side > effects like getting and setting system properties, many of which are > irrelevant, and tightly monitored, in production environments. > > I've temporarily pulled this logic out into a provider pattern: > http://codereview.appspot.com/4527056/ > > ...so that users aren't forced into this behavior. > > This said, I actually feel that the better solution for this is to put > host-substitution logic into ContainerConfig. All these config values come > from there anyway. > > --j > > On Thu, May 12, 2011 at 1:00 PM, <[email protected]> wrote: > >> Author: woodser >> Date: Thu May 12 20:00:18 2011 >> New Revision: 1102446 >> >> URL: http://svn.apache.org/viewvc?rev=1102446&view=rev >> Log: >> Committing Li Xu's patch to detect host & port from HttpServletRequest. >> >> Codereview: http://codereview.appspot.com/4534049/ >> JIRA: https://issues.apache.org/jira/browse/SHINDIG-1534 >> >> Added: >> >> >> shindig/trunk/java/common/src/main/java/org/apache/shindig/common/servlet/HostFilter.java >> >> >> shindig/trunk/java/common/src/main/java/org/apache/shindig/common/servlet/ServletRequestContext.java >> Modified: >> shindig/trunk/config/container.js >> >> >> shindig/trunk/content/samplecontainer/examples/commoncontainer/gadgetCollections.json >> >> >> shindig/trunk/content/samplecontainer/examples/commoncontainer/viewController.js >> >> >> shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultConcatUriManager.java >> >> >> shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultIframeUriManager.java >> >> >> shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultJsUriManager.java >> >> >> shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultProxyUriManager.java >> shindig/trunk/java/server/src/main/webapp/WEB-INF/web.xml >> >> Modified: shindig/trunk/config/container.js >> URL: >> http://svn.apache.org/viewvc/shindig/trunk/config/container.js?rev=1102446&r1=1102445&r2=1102446&view=diff >> >> ============================================================================== >> --- shindig/trunk/config/container.js (original) >> +++ shindig/trunk/config/container.js Thu May 12 20:00:18 2011 >> @@ -103,10 +103,13 @@ >> //"gadgets.securityTokenKeyFile" : "/path/to/key/file.txt", >> >> // URI for the default shindig test instance. >> -"defaultShindigTestHost": "http://${SERVER_HOST}:${SERVER_PORT}", >> +//"defaultShindigTestHost": "http://${SERVER_HOST}:${SERVER_PORT}", >> +"defaultShindigTestHost":"http://%host%", >> + >> >> // Authority (host:port without scheme) for the proxy and concat >> servlets. >> -"defaultShindigProxyConcatAuthority": "${SERVER_HOST}:${SERVER_PORT}", >> +//"defaultShindigProxyConcatAuthority": "${SERVER_HOST}:${SERVER_PORT}", >> +"defaultShindigProxyConcatAuthority":"%host%", >> >> // OS 2.0 Gadget DOCTYPE: used in Gadgets with @specificationVersion 2.0 >> or greater and >> // quirksmode on Gadget has not been set. >> >> Modified: >> shindig/trunk/content/samplecontainer/examples/commoncontainer/gadgetCollections.json >> URL: >> http://svn.apache.org/viewvc/shindig/trunk/content/samplecontainer/examples/commoncontainer/gadgetCollections.json?rev=1102446&r1=1102445&r2=1102446&view=diff >> >> ============================================================================== >> --- >> shindig/trunk/content/samplecontainer/examples/commoncontainer/gadgetCollections.json >> (original) >> +++ >> shindig/trunk/content/samplecontainer/examples/commoncontainer/gadgetCollections.json >> Thu May 12 20:00:18 2011 >> @@ -4,22 +4,22 @@ >> "name": "Publish Subscribe Demo", >> "Description": "This is a sample pub/sub demo showcasing the >> pubsub-2 feature", >> "apps" : [ >> - {"name": "publisher", "url": " >> http://localhost:8080/container/sample-pubsub-2-publisher.xml"}, >> - {"name": "subscriber", "url": " >> http://localhost:8080/container/sample-pubsub-2-subscriber.xml"} >> + {"name": "publisher", "url": >> "/container/sample-pubsub-2-publisher.xml"}, >> + {"name": "subscriber", "url": >> "/container/sample-pubsub-2-subscriber.xml"} >> ] >> }, >> { >> "name": "Activity Streams Sample", >> "Description": "Simple gadget to test base ActivityStreams >> implementation in features", >> "apps" : [ >> - {"name": "ActivityStreams Sample", "url": " >> http://localhost:8080/samplecontainer/examples/ActivityStreams/ActivityStreamGadget.xml >> "} >> + {"name": "ActivityStreams Sample", "url": >> "/samplecontainer/examples/ActivityStreams/ActivityStreamGadget.xml"} >> ] >> }, >> { >> "name": "Sample Media Items Gadget", >> "Description": "This is a sample pub/sub demo showcasing the >> pubsub-2 feature", >> "apps" : [ >> - {"name": "publisher", "url": " >> http://localhost:8080/samplecontainer/examples/media/Media.xml"} >> + {"name": "publisher", "url": >> "/samplecontainer/examples/media/Media.xml"} >> ] >> }, >> { >> >> Modified: >> shindig/trunk/content/samplecontainer/examples/commoncontainer/viewController.js >> URL: >> http://svn.apache.org/viewvc/shindig/trunk/content/samplecontainer/examples/commoncontainer/viewController.js?rev=1102446&r1=1102445&r2=1102446&view=diff >> >> ============================================================================== >> --- >> shindig/trunk/content/samplecontainer/examples/commoncontainer/viewController.js >> (original) >> +++ >> shindig/trunk/content/samplecontainer/examples/commoncontainer/viewController.js >> Thu May 12 20:00:18 2011 >> @@ -45,7 +45,11 @@ $(function() { >> $.each(data.collections, function(i,data){ >> var optionVal = []; >> $.each(data.apps, function(i,data){ >> - optionVal.push(data.url); >> + if (data.url.indexOf("http") < 0){ >> + >> optionVal.push(location.protocol+"//"+location.host+data.url); >> + }else{ >> + optionVal.push(data.url); >> + } >> }); >> $('#gadgetCollection').append('<option >> value="'+ optionVal.toString() + '">' + data.name +'</option>'); >> }); >> >> Added: >> shindig/trunk/java/common/src/main/java/org/apache/shindig/common/servlet/HostFilter.java >> URL: >> http://svn.apache.org/viewvc/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/servlet/HostFilter.java?rev=1102446&view=auto >> >> ============================================================================== >> --- >> shindig/trunk/java/common/src/main/java/org/apache/shindig/common/servlet/HostFilter.java >> (added) >> +++ >> shindig/trunk/java/common/src/main/java/org/apache/shindig/common/servlet/HostFilter.java >> Thu May 12 20:00:18 2011 >> @@ -0,0 +1,50 @@ >> +/* >> + * Licensed to the Apache Software Foundation (ASF) under one >> + * or more contributor license agreements. See the NOTICE file >> + * distributed with this work for additional information >> + * regarding copyright ownership. The ASF licenses this file >> + * to you under the Apache License, Version 2.0 (the >> + * "License"); you may not use this file except in compliance >> + * with the License. You may obtain a copy of the License at >> + * >> + * http://www.apache.org/licenses/LICENSE-2.0 >> + * >> + * Unless required by applicable law or agreed to in writing, >> + * software distributed under the License is distributed on an >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY >> + * KIND, either express or implied. See the License for the >> + * specific language governing permissions and limitations >> + * under the License. >> + */ >> + >> +package org.apache.shindig.common.servlet; >> + >> +import java.io.IOException; >> + >> +import javax.servlet.Filter; >> +import javax.servlet.FilterConfig; >> +import javax.servlet.FilterChain; >> +import javax.servlet.ServletContext; >> +import javax.servlet.ServletException; >> +import javax.servlet.ServletRequest; >> +import javax.servlet.ServletResponse; >> + >> + >> + >> + >> +/** >> + * A Filter that can cache ServletRequest information in ThreadLocal >> variable >> + */ >> +public class HostFilter implements Filter { >> + >> + public void doFilter(ServletRequest request, ServletResponse response, >> FilterChain chain) throws IOException, ServletException { >> + ServletRequestContext.setRequestInfo(request); >> + chain.doFilter(request, response); >> + } >> + >> + public void destroy() { >> + } >> + >> + public void init(FilterConfig arg0) throws ServletException { >> + } >> +} >> >> Added: >> shindig/trunk/java/common/src/main/java/org/apache/shindig/common/servlet/ServletRequestContext.java >> URL: >> http://svn.apache.org/viewvc/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/servlet/ServletRequestContext.java?rev=1102446&view=auto >> >> ============================================================================== >> --- >> shindig/trunk/java/common/src/main/java/org/apache/shindig/common/servlet/ServletRequestContext.java >> (added) >> +++ >> shindig/trunk/java/common/src/main/java/org/apache/shindig/common/servlet/ServletRequestContext.java >> Thu May 12 20:00:18 2011 >> @@ -0,0 +1,105 @@ >> +/* >> + * Licensed to the Apache Software Foundation (ASF) under one >> + * or more contributor license agreements. See the NOTICE file >> + * distributed with this work for additional information >> + * regarding copyright ownership. The ASF licenses this file >> + * to you under the Apache License, Version 2.0 (the >> + * "License"); you may not use this file except in compliance >> + * with the License. You may obtain a copy of the License at >> + * >> + * http://www.apache.org/licenses/LICENSE-2.0 >> + * >> + * Unless required by applicable law or agreed to in writing, >> + * software distributed under the License is distributed on an >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY >> + * KIND, either express or implied. See the License for the >> + * specific language governing permissions and limitations >> + * under the License. >> + */ >> +package org.apache.shindig.common.servlet; >> + >> +import javax.servlet.ServletRequest; >> + >> +public class ServletRequestContext { >> + >> + public static void setRequestInfo(ServletRequest req) { >> + String auth = req.getServerName() + ":" + req.getServerPort(); >> + String fullAuth = req.getScheme() + "://" + auth; >> + authority.set(auth); >> + fullAuthority.set(fullAuth); >> + >> + System.setProperty("authority",auth); >> + System.setProperty("fullAuthority", fullAuth); >> + } >> + >> + /** >> + * A Thread Local holder for authority -- host + port >> + */ >> + private static ThreadLocal<String> authority = new >> ThreadLocal<String>(); >> + >> + /** >> + * A Thread Local holder for full authority -- scheme + host + port >> + */ >> + private static ThreadLocal<String> fullAuthority = new >> ThreadLocal<String>(); >> + >> + >> + public static String getAuthority() { >> + >> + String retVal = authority.get(); >> + if (retVal == null) { >> + retVal = System.getProperty("authority"); >> + if (retVal == null){ >> + retVal = getDefaultAuthority(); >> + } >> + } >> + return retVal; >> + } >> + >> + private static String getDefaultAuthority() { >> + >> + String retVal = System.getProperty("defaultAuthority"); >> + if (retVal == null){ >> + retVal = getServerHostname()+":"+getServerPort(); >> + System.setProperty("defaultAuthority", retVal); >> + } >> + return retVal; >> + >> + } >> + >> + public static String getFullAuthority() { >> + >> + String retVal = fullAuthority.get(); >> + if (retVal == null) { >> + retVal = System.getProperty("fullAuthority"); >> + if (retVal == null){ >> + retVal = getDefaultFullAuthority(); >> + } >> + } >> + return retVal; >> + >> + } >> + >> + private static String getDefaultFullAuthority() { >> + >> + String retVal = System.getProperty("defaultFullAuthority"); >> + if ( retVal != null ){ >> + retVal = "http://"+getServerHostname()+":"+getServerPort(); >> + System.setProperty("defaultFullAuthority", retVal); >> + } >> + return retVal; >> + >> + } >> + >> + private static String getServerPort() { >> + return System.getProperty("shindig.port") != null ? >> System.getProperty("shindig.port") : >> + System.getProperty("jetty.port") != null ? >> System.getProperty("jetty.port") : >> + "8080"; >> + } >> + >> + private static String getServerHostname() { >> + return System.getProperty("shindig.host") != null ? >> System.getProperty("shindig.host") : >> + System.getProperty("jetty.host") != null ? >> System.getProperty("jetty.host") : >> + "localhost"; >> + } >> + >> +} >> >> Modified: >> shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultConcatUriManager.java >> URL: >> http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultConcatUriManager.java?rev=1102446&r1=1102445&r2=1102446&view=diff >> >> ============================================================================== >> --- >> shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultConcatUriManager.java >> (original) >> +++ >> shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultConcatUriManager.java >> Thu May 12 20:00:18 2011 >> @@ -24,6 +24,7 @@ import com.google.inject.Inject; >> import com.google.inject.name.Named; >> >> import org.apache.commons.lang.StringEscapeUtils; >> +import org.apache.shindig.common.servlet.ServletRequestContext; >> import org.apache.shindig.common.uri.Uri; >> import org.apache.shindig.common.uri.UriBuilder; >> import org.apache.shindig.config.ContainerConfig; >> @@ -222,6 +223,8 @@ public class DefaultConcatUriManager imp >> throw new RuntimeException( >> "Missing required config '" + key + "' for container: " + >> container); >> } >> + val = val.replace("%host%", ServletRequestContext.getAuthority()); >> + >> return val; >> } >> >> >> Modified: >> shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultIframeUriManager.java >> URL: >> http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultIframeUriManager.java?rev=1102446&r1=1102445&r2=1102446&view=diff >> >> ============================================================================== >> --- >> shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultIframeUriManager.java >> (original) >> +++ >> shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultIframeUriManager.java >> Thu May 12 20:00:18 2011 >> @@ -27,6 +27,7 @@ import org.apache.commons.lang.StringUti >> import org.apache.shindig.auth.SecurityToken; >> import org.apache.shindig.auth.SecurityTokenCodec; >> import org.apache.shindig.auth.SecurityTokenException; >> +import org.apache.shindig.common.servlet.ServletRequestContext; >> import org.apache.shindig.common.uri.Uri; >> import org.apache.shindig.common.uri.UriBuilder; >> import org.apache.shindig.config.ContainerConfig; >> @@ -342,10 +343,13 @@ public class DefaultIframeUriManager imp >> >> private String getReqVal(String container, String key) { >> String val = config.getString(container, key); >> + >> if (val == null) { >> throw new RuntimeException("Missing required container config param, >> key: " >> + key + ", container: " + container); >> } >> + val = val.replace("%host%", ServletRequestContext.getAuthority()); >> + >> return val; >> } >> >> >> Modified: >> shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultJsUriManager.java >> URL: >> http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultJsUriManager.java?rev=1102446&r1=1102445&r2=1102446&view=diff >> >> ============================================================================== >> --- >> shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultJsUriManager.java >> (original) >> +++ >> shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultJsUriManager.java >> Thu May 12 20:00:18 2011 >> @@ -23,6 +23,7 @@ import com.google.common.base.Splitter; >> import com.google.common.collect.ImmutableList; >> import com.google.inject.Inject; >> >> +import org.apache.shindig.common.servlet.ServletRequestContext; >> import org.apache.shindig.common.uri.Uri; >> import org.apache.shindig.common.uri.UriBuilder; >> import org.apache.shindig.config.ContainerConfig; >> @@ -222,6 +223,7 @@ public class DefaultJsUriManager impleme >> "' missing config for required param: " + key); >> } >> } >> + ret = ret.replace("%host%", ServletRequestContext.getAuthority()); >> return ret; >> } >> >> >> Modified: >> shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultProxyUriManager.java >> URL: >> http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultProxyUriManager.java?rev=1102446&r1=1102445&r2=1102446&view=diff >> >> ============================================================================== >> --- >> shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultProxyUriManager.java >> (original) >> +++ >> shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultProxyUriManager.java >> Thu May 12 20:00:18 2011 >> @@ -25,6 +25,7 @@ import com.google.inject.Inject; >> import com.google.inject.name.Named; >> >> import org.apache.commons.lang.StringUtils; >> +import org.apache.shindig.common.servlet.ServletRequestContext; >> import org.apache.shindig.common.uri.Uri; >> import org.apache.shindig.common.uri.UriBuilder; >> import org.apache.shindig.common.util.Utf8UrlCoder; >> @@ -276,6 +277,7 @@ public class DefaultProxyUriManager impl >> throw new RuntimeException("Missing required container config key: " >> + key + " for " + >> "container: " + container); >> } >> + val = val.replace("%host%", ServletRequestContext.getAuthority()); >> return val; >> } >> } >> >> Modified: shindig/trunk/java/server/src/main/webapp/WEB-INF/web.xml >> URL: >> http://svn.apache.org/viewvc/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.xml?rev=1102446&r1=1102445&r2=1102446&view=diff >> >> ============================================================================== >> --- shindig/trunk/java/server/src/main/webapp/WEB-INF/web.xml (original) >> +++ shindig/trunk/java/server/src/main/webapp/WEB-INF/web.xml Thu May 12 >> 20:00:18 2011 >> @@ -59,14 +59,24 @@ >> <context-param> >> <param-name>system.properties</param-name> >> <param-value> >> - shindig.host=localhost >> - >> - aKey=/shindig/gadgets/proxy?container=default&url= >> - shindig.port= >> - >> + aKey=/shindig/gadgets/proxy?container=default&url= >> </param-value> >> </context-param> >> - >> + >> + <filter> >> + <filter-name>hostFilter</filter-name> >> + >> <filter-class>org.apache.shindig.common.servlet.HostFilter</filter-class> >> + </filter> >> + <filter-mapping> >> + <filter-name>hostFilter</filter-name> >> + <url-pattern>/gadgets/ifr</url-pattern> >> + <url-pattern>/gadgets/js/*</url-pattern> >> + <url-pattern>/gadgets/proxy/*</url-pattern> >> + <url-pattern>/gadgets/concat</url-pattern> >> + <url-pattern>/rpc/*</url-pattern> >> + <url-pattern>/rest/*</url-pattern> >> + </filter-mapping> >> + >> <filter> >> <filter-name>ShiroFilter</filter-name> >> >> <filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class> >> >> >> >
