Reviewers: acleung,

Description:
Fix Super Dev Mode's code server to launch on localhost by default.
(There were comments about this but it wasn't actually true.)
Add -bindAddress option to override this. In particular, -bindAddress
0.0.0.0
restores previous behavior.


Please review this at http://gwt-code-reviews.appspot.com/1740803/

Affected files:
  M dev/codeserver/java/com/google/gwt/dev/codeserver/CodeServer.java
  M dev/codeserver/java/com/google/gwt/dev/codeserver/Options.java
  M dev/codeserver/java/com/google/gwt/dev/codeserver/WebServer.java


Index: dev/codeserver/java/com/google/gwt/dev/codeserver/CodeServer.java
===================================================================
--- dev/codeserver/java/com/google/gwt/dev/codeserver/CodeServer.java (revision 11031) +++ dev/codeserver/java/com/google/gwt/dev/codeserver/CodeServer.java (working copy)
@@ -23,6 +23,7 @@

 import java.io.File;
 import java.io.IOException;
+import java.net.InetAddress;

 /**
* <p>This class contains the {@link #main main method} that starts the code server for
@@ -49,9 +50,11 @@
     try {
       start(options);

+ String url = "http://"; + options.getPreferredHost() + ":" + options.getPort() + "/";
+
       System.out.println();
       System.out.println("The code server is ready.");
- System.out.println("Next, visit: http://localhost:"; + options.getPort() + "/");
+      System.out.println("Next, visit: " + url);
     } catch (Throwable t) {
       t.printStackTrace();
       System.exit(1);
@@ -88,7 +91,7 @@
     SourceHandler sourceHandler = new SourceHandler(modules, logger);

     WebServer webServer = new WebServer(sourceHandler, modules,
-        options.getPort(), logger);
+        options.getBindAddress(), options.getPort(), logger);
     webServer.start();

     return webServer;
Index: dev/codeserver/java/com/google/gwt/dev/codeserver/Options.java
===================================================================
--- dev/codeserver/java/com/google/gwt/dev/codeserver/Options.java (revision 11031) +++ dev/codeserver/java/com/google/gwt/dev/codeserver/Options.java (working copy)
@@ -21,8 +21,11 @@
 import com.google.gwt.util.tools.ArgHandlerDir;
 import com.google.gwt.util.tools.ArgHandlerExtra;
 import com.google.gwt.util.tools.ArgHandlerInt;
+import com.google.gwt.util.tools.ArgHandlerString;

 import java.io.File;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.List;

@@ -35,6 +38,8 @@
   private File workDir;
   private List<String> moduleNames = new ArrayList<String>();
   private final List<File> sourcePath = new ArrayList<File>();
+  private String bindAddress = "127.0.0.1";
+  private String preferredHost = "localhost";
   private int port = 9876;

   /**
@@ -61,6 +66,20 @@
   }

   /**
+   * The IP address where the code server should listen.
+   */
+  String getBindAddress() {
+    return bindAddress;
+  }
+
+  /**
+   * The hostname to put in a URL pointing to the code server.
+   */
+  String getPreferredHost() {
+    return preferredHost;
+  }
+
+  /**
    * The port where the code server will listen for HTTP requests.
    */
   int getPort() {
@@ -74,6 +93,7 @@
   private class ArgProcessor extends ArgProcessorBase {

     public ArgProcessor() {
+      registerHandler(new BindAddressFlag());
       registerHandler(new PortFlag());
       registerHandler(new WorkDirFlag());
       registerHandler(new SourceFlag());
@@ -85,6 +105,43 @@
       return CodeServer.class.getName();
     }

+  }
+
+  private class BindAddressFlag extends ArgHandlerString {
+
+    @Override
+    public String getTag() {
+      return "-bindAddress";
+    }
+
+    @Override
+    public String[] getTagArgs() {
+      return new String[] {"address"};
+    }
+
+    @Override
+    public String getPurpose() {
+      return "The ip address of the code server. Defaults to 127.0.0.1.";
+    }
+
+    @Override
+    public boolean setString(String newValue) {
+      try {
+        InetAddress bindAddress = InetAddress.getByName(newValue);
+        if (bindAddress.isAnyLocalAddress()) {
+          preferredHost = InetAddress.getLocalHost().getHostName();
+        } else {
+          preferredHost = newValue;
+        }
+      } catch (UnknownHostException e) {
+        System.err.println("Can't resolve bind address: " + newValue);
+        return false;
+      }
+
+ // Save the original since there's no way to get it back from an InetAddress.
+      bindAddress = newValue;
+      return true;
+    }
   }

   private class PortFlag extends ArgHandlerInt {
Index: dev/codeserver/java/com/google/gwt/dev/codeserver/WebServer.java
===================================================================
--- dev/codeserver/java/com/google/gwt/dev/codeserver/WebServer.java (revision 11031) +++ dev/codeserver/java/com/google/gwt/dev/codeserver/WebServer.java (working copy)
@@ -37,6 +37,7 @@
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.io.Writer;
+import java.net.InetAddress;
 import java.net.URL;
 import java.net.URLConnection;
 import java.util.HashMap;
@@ -83,13 +84,16 @@

   private final Modules modules;

+  private final String bindAddress;
   private final int port;
   private final TreeLogger logger;
   private Server server;

- public WebServer(SourceHandler handler, Modules modules, int port, TreeLogger logger) { + WebServer(SourceHandler handler, Modules modules, String bindAddress, int port,
+      TreeLogger logger) {
     this.handler = handler;
     this.modules = modules;
+    this.bindAddress = bindAddress;
     this.port = port;
     this.logger = logger;
   }
@@ -97,6 +101,7 @@
   public void start() throws UnableToCompleteException {

     SelectChannelConnector connector = new SelectChannelConnector();
+    connector.setHost(bindAddress);
     connector.setPort(port);
     connector.setReuseAddress(false);
     connector.setSoLingerTime(0);


--
http://groups.google.com/group/Google-Web-Toolkit-Contributors

Reply via email to