Author: yurize
Date: Thu Aug 30 19:46:22 2012
New Revision: 1379094

URL: http://svn.apache.org/viewvc?rev=1379094&view=rev
Log:
Makes websocket configurable in a different port and/or subdomain
(#WAVE-357). By Vicente J. Ruiz Jurado
https://reviews.apache.org/r/5375

Modified:
    incubator/wave/trunk/server-config.xml
    incubator/wave/trunk/server.config.example
    incubator/wave/trunk/src/org/waveprotocol/box/server/CoreSettings.java
    incubator/wave/trunk/src/org/waveprotocol/box/server/gxp/WaveClientPage.gxp
    
incubator/wave/trunk/src/org/waveprotocol/box/server/rpc/ServerRpcProvider.java
    
incubator/wave/trunk/src/org/waveprotocol/box/server/rpc/WaveClientServlet.java
    
incubator/wave/trunk/src/org/waveprotocol/box/webclient/client/WebClient.java

Modified: incubator/wave/trunk/server-config.xml
URL: 
http://svn.apache.org/viewvc/incubator/wave/trunk/server-config.xml?rev=1379094&r1=1379093&r2=1379094&view=diff
==============================================================================
--- incubator/wave/trunk/server-config.xml (original)
+++ incubator/wave/trunk/server-config.xml Thu Aug 30 19:46:22 2012
@@ -4,6 +4,7 @@
   <!-- Properties for server.config -->
   <property name="wave_server_domain" value="local.net" />
   <property name="http_frontend_public_address" value="localhost:9898" />
+  <property name="http_websocket_public_address" 
value="${http_frontend_public_address}" />
   <property name="http_frontend_addresses" 
value="${http_frontend_public_address}" />
   <property name="resource_bases" value="./war" />
   <property name="signer_info_store_type" value="file" />
@@ -71,6 +72,8 @@
           <token key="WAVE_SERVER_DOMAIN" value="${wave_server_domain}" />
           <token key="HTTP_FRONTEND_PUBLIC_ADDRESS"
                  value="${http_frontend_public_address}" />
+          <token key="HTTP_WEBSOCKET_PUBLIC_ADDRESS"
+                 value="${http_websocket_public_address}" />
           <token key="HTTP_FRONTEND_ADDRESSES"
                  value="${http_frontend_addresses}" />
           <token key="RESOURCE_BASES" value="${resource_bases}" />

Modified: incubator/wave/trunk/server.config.example
URL: 
http://svn.apache.org/viewvc/incubator/wave/trunk/server.config.example?rev=1379094&r1=1379093&r2=1379094&view=diff
==============================================================================
--- incubator/wave/trunk/server.config.example (original)
+++ incubator/wave/trunk/server.config.example Thu Aug 30 19:46:22 2012
@@ -14,6 +14,12 @@ wave_server_domain = @WAVE_SERVER_DOMAIN
 # Default value: localhost:9898
 http_frontend_public_address = @HTTP_FRONTEND_PUBLIC_ADDRESS@
 
+# A optional host:port address on which to listen for websocket connections.
+# If no value is set for http_websocket_public_address it defaults to the 
first address specified
+# by http_frontend_public_address.
+# Default value: localhost:9898
+http_websocket_public_address = @HTTP_WEBSOCKET_PUBLIC_ADDRESS@
+
 # Default value: values passed to http_frontend_public_address.
 http_frontend_addresses = @HTTP_FRONTEND_ADDRESSES@
 

Modified: incubator/wave/trunk/src/org/waveprotocol/box/server/CoreSettings.java
URL: 
http://svn.apache.org/viewvc/incubator/wave/trunk/src/org/waveprotocol/box/server/CoreSettings.java?rev=1379094&r1=1379093&r2=1379094&view=diff
==============================================================================
--- incubator/wave/trunk/src/org/waveprotocol/box/server/CoreSettings.java 
(original)
+++ incubator/wave/trunk/src/org/waveprotocol/box/server/CoreSettings.java Thu 
Aug 30 19:46:22 2012
@@ -28,6 +28,7 @@ import java.util.List;
 public class CoreSettings {
   public static final String WAVE_SERVER_DOMAIN = "wave_server_domain";
   public static final String HTTP_FRONTEND_PUBLIC_ADDRESS = 
"http_frontend_public_address";
+  public static final String HTTP_WEBSOCKET_PUBLIC_ADDRESS = 
"http_websocket_public_address";
   public static final String HTTP_FRONTEND_ADDRESSES = 
"http_frontend_addresses";
   public static final String RESOURCE_BASES = "resource_bases";
   public static final String WAVESERVER_DISABLE_VERIFICATION = 
"waveserver_disable_verification";
@@ -72,6 +73,10 @@ public class CoreSettings {
       description = "The server's public address.")
   private static String httpFrontEndPublicAddress;
 
+  @Setting(name = HTTP_WEBSOCKET_PUBLIC_ADDRESS, defaultValue = 
"localhost:9898",
+      description = "The server's websocket public address.")
+  private static String httpWebsocketPublicAddress;
+
   @Setting(name = HTTP_FRONTEND_ADDRESSES, defaultValue = "localhost:9898",
       description = "A comman seperated list of address on which to listen for 
connections."
           + " Each address is a host or ip and port seperated by a colon.")

Modified: 
incubator/wave/trunk/src/org/waveprotocol/box/server/gxp/WaveClientPage.gxp
URL: 
http://svn.apache.org/viewvc/incubator/wave/trunk/src/org/waveprotocol/box/server/gxp/WaveClientPage.gxp?rev=1379094&r1=1379093&r2=1379094&view=diff
==============================================================================
--- incubator/wave/trunk/src/org/waveprotocol/box/server/gxp/WaveClientPage.gxp 
(original)
+++ incubator/wave/trunk/src/org/waveprotocol/box/server/gxp/WaveClientPage.gxp 
Thu Aug 30 19:46:22 2012
@@ -31,6 +31,7 @@
   <gxp:import class="org.waveprotocol.box.server.gxp.TopBar" />
   <gxp:param name='sessionJson' type='JSONObject' />
   <gxp:param name='clientFlags' type='JSONObject' />
+  <gxp:param name='websocketAddress' type='String' />
   <gxp:param name='topBar' type='HtmlClosure' />
   <gxp:param name='analyticsAccount' type='String'/>
 
@@ -44,6 +45,7 @@
       <!-- Session variables. -->
       <script type="text/javascript" language="javascript">
         var __session = <gxp:eval expr='sessionJson' />;
+        var __websocket_address = <gxp:eval expr='websocketAddress' />;
         var __client_flags = <gxp:eval expr='clientFlags' />;
       </script>
       <style type="text/css">

Modified: 
incubator/wave/trunk/src/org/waveprotocol/box/server/rpc/ServerRpcProvider.java
URL: 
http://svn.apache.org/viewvc/incubator/wave/trunk/src/org/waveprotocol/box/server/rpc/ServerRpcProvider.java?rev=1379094&r1=1379093&r2=1379094&view=diff
==============================================================================
--- 
incubator/wave/trunk/src/org/waveprotocol/box/server/rpc/ServerRpcProvider.java 
(original)
+++ 
incubator/wave/trunk/src/org/waveprotocol/box/server/rpc/ServerRpcProvider.java 
Thu Aug 30 19:46:22 2012
@@ -44,6 +44,7 @@ import com.glines.socketio.server.transp
 import com.glines.socketio.server.transport.XHRPollingTransport;
 import com.glines.socketio.server.transport.jetty.JettyWebSocketTransport;
 
+import org.apache.commons.lang.StringUtils;
 import org.eclipse.jetty.http.ssl.SslContextFactory;
 import org.eclipse.jetty.server.ssl.SslSelectChannelConnector;
 import org.eclipse.jetty.server.Connector;
@@ -70,6 +71,7 @@ import org.waveprotocol.wave.util.loggin
 import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.net.SocketAddress;
+import java.util.ArrayList;
 import java.util.EnumSet;
 import java.util.List;
 import java.util.Map;
@@ -339,6 +341,7 @@ public class ServerRpcProvider {
 
   @Inject
   public ServerRpcProvider(@Named(CoreSettings.HTTP_FRONTEND_ADDRESSES) 
List<String> httpAddresses,
+      @Named(CoreSettings.HTTP_WEBSOCKET_PUBLIC_ADDRESS) String 
websocketAddress,
       @Named(CoreSettings.FLASHSOCKET_POLICY_PORT) Integer 
flashsocketPolicyPort,
       @Named(CoreSettings.RESOURCE_BASES) List<String> resourceBases,
       SessionManager sessionManager, org.eclipse.jetty.server.SessionManager 
jettySessionManager,
@@ -346,7 +349,7 @@ public class ServerRpcProvider {
       @Named(CoreSettings.ENABLE_SSL) boolean sslEnabled,
       @Named(CoreSettings.SSL_KEYSTORE_PATH) String sslKeystorePath,
       @Named(CoreSettings.SSL_KEYSTORE_PASSWORD) String sslKeystorePassword) {
-    this(parseAddressList(httpAddresses), flashsocketPolicyPort, resourceBases
+    this(parseAddressList(httpAddresses, websocketAddress), 
flashsocketPolicyPort, resourceBases
         .toArray(new String[0]), sessionManager, jettySessionManager, 
sessionStoreDir,
         sslEnabled, sslKeystorePath, sslKeystorePassword);
   }
@@ -482,12 +485,17 @@ public class ServerRpcProvider {
     };
   }
 
-  private static InetSocketAddress[] parseAddressList(List<String> 
addressList) {
+  private static InetSocketAddress[] parseAddressList(List<String> 
addressList, String websocketAddress) {
     if (addressList == null || addressList.size() == 0) {
       return new InetSocketAddress[0];
     } else {
       Set<InetSocketAddress> addresses = Sets.newHashSet();
-      for (String str : addressList) {
+      // We add the websocketAddress as another listening address.
+      ArrayList<String> mergedAddressList = new ArrayList<String>(addressList);
+      if (!StringUtils.isEmpty(websocketAddress)) {
+        mergedAddressList.add(websocketAddress);
+      }
+      for (String str : mergedAddressList) {
         if (str.length() == 0) {
           LOG.warning("Encountered empty address in http addresses list.");
         } else {

Modified: 
incubator/wave/trunk/src/org/waveprotocol/box/server/rpc/WaveClientServlet.java
URL: 
http://svn.apache.org/viewvc/incubator/wave/trunk/src/org/waveprotocol/box/server/rpc/WaveClientServlet.java?rev=1379094&r1=1379093&r2=1379094&view=diff
==============================================================================
--- 
incubator/wave/trunk/src/org/waveprotocol/box/server/rpc/WaveClientServlet.java 
(original)
+++ 
incubator/wave/trunk/src/org/waveprotocol/box/server/rpc/WaveClientServlet.java 
Thu Aug 30 19:46:22 2012
@@ -22,6 +22,7 @@ import com.google.gxp.base.GxpContext;
 import com.google.inject.Inject;
 import com.google.inject.name.Named;
 
+import org.apache.commons.lang.StringUtils;
 import org.json.JSONException;
 import org.json.JSONObject;
 import org.waveprotocol.box.common.SessionConstants;
@@ -39,6 +40,7 @@ import java.io.IOException;
 import java.lang.reflect.Method;
 import java.util.Enumeration;
 import java.util.HashMap;
+import java.util.List;
 
 import javax.inject.Singleton;
 import javax.servlet.http.HttpServlet;
@@ -69,6 +71,7 @@ public class WaveClientServlet extends H
   private final String domain;
   private final String analyticsAccount;
   private final SessionManager sessionManager;
+  private final String websocketAddress;
 
   /**
    * Creates a servlet for the wave client.
@@ -76,9 +79,13 @@ public class WaveClientServlet extends H
   @Inject
   public WaveClientServlet(
       @Named(CoreSettings.WAVE_SERVER_DOMAIN) String domain,
+      @Named(CoreSettings.HTTP_FRONTEND_ADDRESSES) List<String> httpAddresses,
+      @Named(CoreSettings.HTTP_WEBSOCKET_PUBLIC_ADDRESS) String 
websocketAddress,
       @Named(CoreSettings.ANALYTICS_ACCOUNT) String analyticsAccount,
       SessionManager sessionManager) {
     this.domain = domain;
+    this.websocketAddress = StringUtils.isEmpty(websocketAddress) ?
+        httpAddresses.get(0) : websocketAddress;
     this.analyticsAccount = analyticsAccount;
     this.sessionManager = sessionManager;
   }
@@ -106,7 +113,7 @@ public class WaveClientServlet extends H
 
     try {
       WaveClientPage.write(response.getWriter(), new 
GxpContext(request.getLocale()),
-          getSessionJson(request.getSession(false)), getClientFlags(request),
+          getSessionJson(request.getSession(false)), getClientFlags(request), 
websocketAddress,
           TopBar.getGxpClosure(username, userDomain), analyticsAccount);
     } catch (IOException e) {
       LOG.warning("Failed to write GXP for request " + request, e);

Modified: 
incubator/wave/trunk/src/org/waveprotocol/box/webclient/client/WebClient.java
URL: 
http://svn.apache.org/viewvc/incubator/wave/trunk/src/org/waveprotocol/box/webclient/client/WebClient.java?rev=1379094&r1=1379093&r2=1379094&view=diff
==============================================================================
--- 
incubator/wave/trunk/src/org/waveprotocol/box/webclient/client/WebClient.java 
(original)
+++ 
incubator/wave/trunk/src/org/waveprotocol/box/webclient/client/WebClient.java 
Thu Aug 30 19:46:22 2012
@@ -167,7 +167,7 @@ public class WebClient implements EntryP
     HistorySupport.init(new HistoryProviderDefault());
     HistoryChangeListener.init();
 
-    websocket = new WaveWebSocketClient(useSocketIO(), 
getWebSocketBaseUrl(GWT.getModuleBaseURL()));
+    websocket = new WaveWebSocketClient(useSocketIO(), getWebSocketBaseUrl());
     websocket.connect();
 
     if (Session.get().isLoggedIn()) {
@@ -272,7 +272,7 @@ public class WebClient implements EntryP
    * Returns <code>ws(s)://yourhost[:port]/</code>.
    */
   // XXX check formatting wrt GPE
-  private native String getWebSocketBaseUrl(String moduleBase) /*-{return 
((window.location.protocol == "https:") ? "wss" : "ws") + 
/:\/\/[^\/]+/.exec(moduleBase)[0] + "/";}-*/;
+  private native String getWebSocketBaseUrl() /*-{return 
((window.location.protocol == "https:") ? "wss" : "ws") + "://" +  
$wnd.__websocket_address + "/";}-*/;
 
   private native boolean useSocketIO() /*-{ return !window.WebSocket }-*/;
 


Reply via email to