You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2011/11/29 00:16:48 UTC

svn commit: r1207692 - in /tomcat/trunk: java/org/apache/catalina/connector/ java/org/apache/coyote/ java/org/apache/tomcat/util/net/ test/org/apache/catalina/authenticator/ test/org/apache/catalina/connector/ test/org/apache/catalina/core/ test/org/ap...

Author: markt
Date: Mon Nov 28 23:16:42 2011
New Revision: 1207692

URL: http://svn.apache.org/viewvc?rev=1207692&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=52028
Add support for automatic selection of a free port for a connector when the special value of zero is used

Modified:
    tomcat/trunk/java/org/apache/catalina/connector/Connector.java
    tomcat/trunk/java/org/apache/catalina/connector/mbeans-descriptors.xml
    tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java
    tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java
    tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java
    tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java
    tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java
    tomcat/trunk/test/org/apache/catalina/authenticator/TestFormAuthenticator.java
    tomcat/trunk/test/org/apache/catalina/connector/TestConnector.java
    tomcat/trunk/test/org/apache/catalina/connector/TestRequest.java
    tomcat/trunk/test/org/apache/catalina/core/TestStandardContext.java
    tomcat/trunk/test/org/apache/catalina/core/TestSwallowAbortedUploads.java
    tomcat/trunk/test/org/apache/catalina/filters/TestExpiresFilter.java
    tomcat/trunk/test/org/apache/catalina/filters/TestRemoteIpFilter.java
    tomcat/trunk/test/org/apache/catalina/mbeans/TestRegistration.java
    tomcat/trunk/test/org/apache/catalina/servlets/TestDefaultServlet.java
    tomcat/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java
    tomcat/trunk/test/org/apache/catalina/startup/TomcatBaseTest.java
    tomcat/trunk/test/org/apache/coyote/http11/TestAbstractHttp11Processor.java
    tomcat/trunk/test/org/apache/coyote/http11/TestInternalInputBuffer.java
    tomcat/trunk/test/org/apache/coyote/http11/filters/TestChunkedInputFilter.java
    tomcat/trunk/test/org/apache/tomcat/util/http/TestCookiesAllowEquals.java
    tomcat/trunk/test/org/apache/tomcat/util/http/TestCookiesAllowHttpSeps.java
    tomcat/trunk/test/org/apache/tomcat/util/http/TestCookiesAllowNameOnly.java
    tomcat/trunk/test/org/apache/tomcat/util/http/TestCookiesDisallowEquals.java
    tomcat/trunk/test/org/apache/tomcat/util/net/TestXxxEndpoint.java
    tomcat/trunk/webapps/docs/config/ajp.xml
    tomcat/trunk/webapps/docs/config/http.xml

Modified: tomcat/trunk/java/org/apache/catalina/connector/Connector.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/Connector.java?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/Connector.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/Connector.java Mon Nov 28 23:16:42 2011
@@ -60,7 +60,6 @@ public class Connector extends Lifecycle
 
     // ------------------------------------------------------------ Constructor
 
-
     public Connector() {
         this(null);
     }
@@ -114,7 +113,7 @@ public class Connector extends Lifecycle
     /**
      * The port number on which we listen for requests.
      */
-    protected int port = 0;
+    protected int port = -1;
 
 
     /**
@@ -257,7 +256,6 @@ public class Connector extends Lifecycle
 
     // ------------------------------------------------------------- Properties
 
-
     /**
      * Return a configured property.
      */
@@ -497,7 +495,9 @@ public class Connector extends Lifecycle
     }
 
     /**
-     * Return the port number on which we listen for requests.
+     * Return the port number on which this connector is configured to listen
+     * for requests. The special value of 0 means select a random free port
+     * when the socket is bound.
      */
     public int getPort() {
 
@@ -520,6 +520,16 @@ public class Connector extends Lifecycle
 
 
     /**
+     * Return the port number on which this connector is listening to requests.
+     * If the special value for {@link #port} of zero is used then this method
+     * will report the actual port bound.
+     */
+    public int getLocalPort() {
+        return ((Integer) getProperty("localPort")).intValue();
+    }
+
+
+    /**
      * Return the Coyote protocol handler in use.
      */
     public String getProtocol() {
@@ -864,7 +874,13 @@ public class Connector extends Lifecycle
         StringBuilder sb = new StringBuilder("type=");
         sb.append(type);
         sb.append(",port=");
-        sb.append(getPort());
+        int port = getPort();
+        if (port > 0) {
+            sb.append(getPort());
+        } else {
+            sb.append("auto-");
+            sb.append(getProperty("nameIndex"));
+        }
         if (addressObj != null) {
             String address = addressObj.toString();
             if (address.length() > 0) {
@@ -938,7 +954,7 @@ public class Connector extends Lifecycle
     protected void startInternal() throws LifecycleException {
 
         // Validate settings before starting
-        if (getPort() < 1) {
+        if (getPort() < 0) {
             throw new LifecycleException(sm.getString(
                     "coyoteConnector.invalidPort", Integer.valueOf(getPort())));
         }
@@ -1014,11 +1030,18 @@ public class Connector extends Lifecycle
         StringBuilder sb = new StringBuilder("Connector[");
         sb.append(getProtocol());
         sb.append('-');
-        sb.append(getPort());
+        int port = getPort();
+        if (port > 0) {
+            sb.append(getPort());
+        } else {
+            sb.append("auto-");
+            sb.append(getProperty("nameIndex"));
+        }
         sb.append(']');
         return sb.toString();
     }
 
+
     // -------------------- JMX registration  --------------------
 
     @Override

Modified: tomcat/trunk/java/org/apache/catalina/connector/mbeans-descriptors.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/mbeans-descriptors.xml?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/mbeans-descriptors.xml (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/mbeans-descriptors.xml Mon Nov 28 23:16:42 2011
@@ -77,6 +77,10 @@
           description="The number of seconds Tomcat will wait for a subsequent request before closing the connection"
                  type="int"/>
 
+    <attribute   name="localPort"
+          description="The port number on which this connector is listening to requests. If the special value for port of zero is used then this method will report the actual port bound."
+                type="int"/>
+
     <attribute   name="maxKeepAliveRequests"
           description="Maximum number of Keep-Alive requests to honor per connection"
                  type="int"/>
@@ -108,7 +112,7 @@
                  type="int"/>
 
     <attribute   name="port"
-          description="The port number on which we listen for requests"
+          description="The port number on which this connector is configured to listen for requests. The special value of 0 means select a random free port when the socket is bound."
                 type="int"/>
 
     <!-- Common -->

Modified: tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java (original)
+++ tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java Mon Nov 28 23:16:42 2011
@@ -48,6 +48,13 @@ public abstract class AbstractProtocol i
 
 
     /**
+     * Counter used to generate unique JMX names for connectors using automatic
+     * port binding.
+     */
+    private static final AtomicInteger nameCounter = new AtomicInteger(0);
+
+
+    /**
      * Name of MBean for the Global Request Processor.
      */
     protected ObjectName rgOname = null;
@@ -60,6 +67,14 @@ public abstract class AbstractProtocol i
 
 
     /**
+     * Unique ID for this connector. Only used if the connector is configured
+     * to use a random port as the port will change if stop(), start() is
+     * called.
+     */
+    private int nameIndex = 0;
+
+
+    /**
      * Endpoint that provides low-level network I/O - must be matched to the
      * ProtocolHandler implementation (ProtocolHandler using BIO, requires BIO
      * Endpoint etc.).
@@ -194,6 +209,8 @@ public abstract class AbstractProtocol i
     }
 
 
+    public int getLocalPort() { return endpoint.getLocalPort(); }
+
     /*
      * When Tomcat expects data from the client, this is the time Tomcat will
      * wait for that data to arrive before closing the connection.
@@ -220,6 +237,15 @@ public abstract class AbstractProtocol i
 
     // ---------------------------------------------------------- Public methods
 
+    public synchronized int getNameIndex() {
+        if (nameIndex == 0) {
+            nameIndex = nameCounter.incrementAndGet();
+        }
+
+        return nameIndex;
+    }
+
+
     /**
      * The name will be prefix-address-port if address is non-null and
      * prefix-port if the address is null. The name will be appropriately quoted
@@ -232,7 +258,13 @@ public abstract class AbstractProtocol i
             name.append(getAddress());
             name.append('-');
         }
-        name.append(endpoint.getPort());
+        int port = getLocalPort();
+        if (port > 0) {
+            name.append(port);
+        } else {
+            name.append("auto-");
+            name.append(getNameIndex());
+        }
         return ObjectName.quote(name.toString());
     }
 
@@ -313,7 +345,13 @@ public abstract class AbstractProtocol i
 
         StringBuilder name = new StringBuilder(getDomain());
         name.append(":type=ProtocolHandler,port=");
-        name.append(getPort());
+        int port = getPort();
+        if (port > 0) {
+            name.append(getPort());
+        } else {
+            name.append("auto-");
+            name.append(getNameIndex());
+        }
         InetAddress address = getAddress();
         if (address != null) {
             name.append(",address=");
@@ -322,6 +360,7 @@ public abstract class AbstractProtocol i
         return new ObjectName(name.toString());
     }
 
+
     // ------------------------------------------------------- Lifecycle methods
 
     /*

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java Mon Nov 28 23:16:42 2011
@@ -186,6 +186,7 @@ public abstract class AbstractEndpoint {
     public int getPort() { return port; }
     public void setPort(int port ) { this.port=port; }
 
+    public abstract int getLocalPort();
 
     /**
      * Address for the server socket.

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Mon Nov 28 23:16:42 2011
@@ -37,6 +37,7 @@ import org.apache.tomcat.jni.Pool;
 import org.apache.tomcat.jni.SSL;
 import org.apache.tomcat.jni.SSLContext;
 import org.apache.tomcat.jni.SSLSocket;
+import org.apache.tomcat.jni.Sockaddr;
 import org.apache.tomcat.jni.Socket;
 import org.apache.tomcat.jni.Status;
 import org.apache.tomcat.util.ExceptionUtils;
@@ -316,8 +317,29 @@ public class AprEndpoint extends Abstrac
     public void setSSLInsecureRenegotiation(boolean SSLInsecureRenegotiation) { this.SSLInsecureRenegotiation = SSLInsecureRenegotiation; }
     public boolean getSSLInsecureRenegotiation() { return SSLInsecureRenegotiation; }
 
-    // --------------------------------------------------------- Public Methods
 
+    /**
+     * Port in use.
+     */
+    @Override
+    public int getLocalPort() {
+        long s = serverSock;
+        if (s == 0) {
+            return -1;
+        } else {
+            long sa;
+            try {
+                sa = Address.get(Socket.APR_LOCAL, s);
+                Sockaddr addr = Address.getInfo(sa);
+                return addr.port;
+            } catch (Exception e) {
+                return -1;
+            }
+        }
+    }
+
+
+    // --------------------------------------------------------- Public Methods
 
     /**
      * Number of keepalive sockets.

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java Mon Nov 28 23:16:42 2011
@@ -89,6 +89,18 @@ public class JIoEndpoint extends Abstrac
     public void setServerSocketFactory(ServerSocketFactory factory) { this.serverSocketFactory = factory; }
     public ServerSocketFactory getServerSocketFactory() { return serverSocketFactory; }
 
+    /**
+     * Port in use.
+     */
+    @Override
+    public int getLocalPort() {
+        ServerSocket s = serverSocket;
+        if (s == null) {
+            return -1;
+        } else {
+            return s.getLocalPort();
+        }
+    }
 
     /*
      * Optional feature support.

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Mon Nov 28 23:16:42 2011
@@ -21,6 +21,7 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.net.InetSocketAddress;
+import java.net.ServerSocket;
 import java.net.Socket;
 import java.net.SocketTimeoutException;
 import java.nio.ByteBuffer;
@@ -387,6 +388,26 @@ public class NioEndpoint extends Abstrac
     public SSLContext getSSLContext() { return sslContext;}
     public void setSSLContext(SSLContext c) { sslContext = c;}
 
+
+    /**
+     * Port in use.
+     */
+    @Override
+    public int getLocalPort() {
+        ServerSocketChannel ssc = serverSock;
+        if (ssc == null) {
+            return -1;
+        } else {
+            ServerSocket s = ssc.socket();
+            if (s == null) {
+                return -1;
+            } else {
+                return s.getLocalPort();
+            }
+        }
+    }
+
+
     // --------------------------------------------------------- OOM Parachute Methods
 
     protected void checkParachute() {

Modified: tomcat/trunk/test/org/apache/catalina/authenticator/TestFormAuthenticator.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/authenticator/TestFormAuthenticator.java?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/authenticator/TestFormAuthenticator.java (original)
+++ tomcat/trunk/test/org/apache/catalina/authenticator/TestFormAuthenticator.java Mon Nov 28 23:16:42 2011
@@ -115,9 +115,10 @@ public class TestFormAuthenticator exten
             realm.addUserRole("tomcat", "tomcat");
             ctx.setRealm(realm);
 
-            setPort(getPort());
-
             tomcat.start();
+
+            // Port only known after Tomcat starts
+            setPort(getPort());
         }
 
         private void doResourceRequest(String method) throws Exception {

Modified: tomcat/trunk/test/org/apache/catalina/connector/TestConnector.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/connector/TestConnector.java?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/connector/TestConnector.java (original)
+++ tomcat/trunk/test/org/apache/catalina/connector/TestConnector.java Mon Nov 28 23:16:42 2011
@@ -19,6 +19,7 @@ package org.apache.catalina.connector;
 import java.net.SocketTimeoutException;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 import org.junit.Test;
 
@@ -69,4 +70,26 @@ public class TestConnector extends Tomca
         }
         assertEquals(503, rc);
     }
+
+
+    @Test
+    public void testPort() throws Exception {
+        Tomcat tomcat = getTomcatInstance();
+
+        Connector connector1 = tomcat.getConnector();
+        connector1.setPort(0);
+
+        Connector connector2 = new Connector();
+        connector2.setPort(0);
+
+        tomcat.getService().addConnector(connector2);
+
+        tomcat.start();
+
+        int localPort1 = connector1.getLocalPort();
+        int localPort2 = connector2.getLocalPort();
+
+        assertTrue(localPort1 > 0);
+        assertTrue(localPort2 > 0);
+    }
 }

Modified: tomcat/trunk/test/org/apache/catalina/connector/TestRequest.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/connector/TestRequest.java?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/connector/TestRequest.java (original)
+++ tomcat/trunk/test/org/apache/catalina/connector/TestRequest.java Mon Nov 28 23:16:42 2011
@@ -62,7 +62,6 @@ public class TestRequest extends TomcatB
     @Test
     public void testBug37794() {
         Bug37794Client client = new Bug37794Client(true);
-        client.setPort(getPort());
 
         // Edge cases around zero
         client.doRequest(-1, false); // Unlimited
@@ -111,7 +110,6 @@ public class TestRequest extends TomcatB
     @Test
     public void testBug37794withoutFilter() {
         Bug37794Client client = new Bug37794Client(false);
-        client.setPort(getPort());
 
         // Edge cases around actual content length
         client.reset();
@@ -180,6 +178,8 @@ public class TestRequest extends TomcatB
 
             tomcat.start();
 
+            setPort(tomcat.getConnector().getLocalPort());
+
             init = true;
         }
 
@@ -391,7 +391,6 @@ public class TestRequest extends TomcatB
     @Test
     public void testBug48692() {
         Bug48692Client client = new Bug48692Client();
-        client.setPort(getPort());
 
         // Make sure GET works properly
         client.doRequest("GET", "foo=bar", null, null, false);
@@ -518,6 +517,8 @@ public class TestRequest extends TomcatB
             root.addServletMapping("/echo", "EchoParameters");
             tomcat.start();
 
+            setPort(tomcat.getConnector().getLocalPort());
+
             init = true;
         }
 

Modified: tomcat/trunk/test/org/apache/catalina/core/TestStandardContext.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/core/TestStandardContext.java?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/core/TestStandardContext.java (original)
+++ tomcat/trunk/test/org/apache/catalina/core/TestStandardContext.java Mon Nov 28 23:16:42 2011
@@ -97,11 +97,12 @@ public class TestStandardContext extends
         Tomcat.addServlet(root, "Bug46243", new HelloWorldServlet());
         root.addServletMapping("/", "Bug46243");
 
+
         tomcat.start();
 
         // Configure the client
-        Bug46243Client client = new Bug46243Client();
-        client.setPort(getPort());
+        Bug46243Client client =
+                new Bug46243Client(tomcat.getConnector().getLocalPort());
         client.setRequest(new String[] { REQUEST });
 
         client.connect();
@@ -110,6 +111,11 @@ public class TestStandardContext extends
     }
 
     private static final class Bug46243Client extends SimpleHttpClient {
+
+        public Bug46243Client(int port) {
+            setPort(port);
+        }
+
         @Override
         public boolean isResponseBodyOK() {
             // Don't care about the body in this test
@@ -442,7 +448,6 @@ public class TestStandardContext extends
     @Test
     public void testBug49711() {
         Bug49711Client client = new Bug49711Client();
-        client.setPort(getPort());
 
         // Make sure non-multipart works properly
         client.doRequest("/regular", false, false);
@@ -531,6 +536,8 @@ public class TestStandardContext extends
             context.addServletMapping("/multipart", "multipart");
             tomcat.start();
 
+            setPort(tomcat.getConnector().getLocalPort());
+
             init = true;
         }
 

Modified: tomcat/trunk/test/org/apache/catalina/core/TestSwallowAbortedUploads.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/core/TestSwallowAbortedUploads.java?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/core/TestSwallowAbortedUploads.java (original)
+++ tomcat/trunk/test/org/apache/catalina/core/TestSwallowAbortedUploads.java Mon Nov 28 23:16:42 2011
@@ -51,7 +51,6 @@ public class TestSwallowAbortedUploads e
      */
     public Exception doAbortedUploadTest(AbortedUploadClient client, boolean limited,
                             boolean swallow) {
-        client.setPort(getPort());
         Exception ex = client.doRequest(limited, swallow);
         if (log.isDebugEnabled()) {
             log.debug("Response line: " + client.getResponseLine());
@@ -70,7 +69,6 @@ public class TestSwallowAbortedUploads e
      */
     public Exception doAbortedPOSTTest(AbortedPOSTClient client, int status,
                             boolean swallow) {
-        client.setPort(getPort());
         Exception ex = client.doRequest(status, swallow);
         if (log.isDebugEnabled()) {
             log.debug("Response line: " + client.getResponseLine());
@@ -254,6 +252,7 @@ public class TestSwallowAbortedUploads e
             context.setSwallowAbortedUploads(swallow);
 
             tomcat.start();
+            setPort(tomcat.getConnector().getLocalPort());
 
             init = true;
         }
@@ -367,6 +366,8 @@ public class TestSwallowAbortedUploads e
 
             tomcat.start();
 
+            setPort(tomcat.getConnector().getLocalPort());
+
             init = true;
         }
 

Modified: tomcat/trunk/test/org/apache/catalina/filters/TestExpiresFilter.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/filters/TestExpiresFilter.java?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/filters/TestExpiresFilter.java (original)
+++ tomcat/trunk/test/org/apache/catalina/filters/TestExpiresFilter.java Mon Nov 28 23:16:42 2011
@@ -432,7 +432,7 @@ public class TestExpiresFilter extends T
 
             // TEST
             HttpURLConnection httpURLConnection = (HttpURLConnection) new URL(
-                    "http://localhost:" + tomcat.getConnector().getPort() +
+                    "http://localhost:" + tomcat.getConnector().getLocalPort() +
                             "/test").openConnection();
 
             // VALIDATE

Modified: tomcat/trunk/test/org/apache/catalina/filters/TestRemoteIpFilter.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/filters/TestRemoteIpFilter.java?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/filters/TestRemoteIpFilter.java (original)
+++ tomcat/trunk/test/org/apache/catalina/filters/TestRemoteIpFilter.java Mon Nov 28 23:16:42 2011
@@ -537,8 +537,9 @@ public class TestRemoteIpFilter extends 
         getTomcatInstance().start();
 
         // TEST
-        HttpURLConnection httpURLConnection = (HttpURLConnection) new URL("http://localhost:" + tomcat.getConnector().getPort() + "/test")
-                .openConnection();
+        HttpURLConnection httpURLConnection = (HttpURLConnection) new URL(
+                "http://localhost:" + tomcat.getConnector().getLocalPort() +
+                "/test").openConnection();
         String expectedRemoteAddr = "my-remote-addr";
         httpURLConnection.addRequestProperty("x-forwarded-for", expectedRemoteAddr);
         httpURLConnection.addRequestProperty("x-forwarded-proto", "https");

Modified: tomcat/trunk/test/org/apache/catalina/mbeans/TestRegistration.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/mbeans/TestRegistration.java?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/mbeans/TestRegistration.java (original)
+++ tomcat/trunk/test/org/apache/catalina/mbeans/TestRegistration.java Mon Nov 28 23:16:42 2011
@@ -147,7 +147,7 @@ public class TestRegistration extends To
         ArrayList<String> expected = new ArrayList<String>(Arrays.asList(basicMBeanNames()));
         expected.addAll(Arrays.asList(hostMBeanNames("localhost")));
         expected.addAll(Arrays.asList(contextMBeanNames("localhost", contextName)));
-        expected.addAll(Arrays.asList(connectorMBeanNames(Integer.toString(getPort()), protocol)));
+        expected.addAll(Arrays.asList(connectorMBeanNames("auto-1", protocol)));
         expected.addAll(Arrays.asList(optionalMBeanNames("localhost")));
 
         // Did we find all expected MBeans?

Modified: tomcat/trunk/test/org/apache/catalina/servlets/TestDefaultServlet.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/servlets/TestDefaultServlet.java?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/servlets/TestDefaultServlet.java (original)
+++ tomcat/trunk/test/org/apache/catalina/servlets/TestDefaultServlet.java Mon Nov 28 23:16:42 2011
@@ -198,8 +198,8 @@ public class TestDefaultServlet extends 
         tomcat.addWebapp(null, contextPath, appDir.getAbsolutePath());
         tomcat.start();
 
-        TestCustomErrorClient client = new TestCustomErrorClient();
-        client.setPort(getPort());
+        TestCustomErrorClient client =
+                new TestCustomErrorClient(tomcat.getConnector().getLocalPort());
 
         client.reset();
         client.setRequest(new String[] {
@@ -276,8 +276,8 @@ public class TestDefaultServlet extends 
         tomcat.addWebapp(null, contextPath, appDir.getAbsolutePath());
         tomcat.start();
 
-        TestCustomErrorClient client = new TestCustomErrorClient();
-        client.setPort(getPort());
+        TestCustomErrorClient client =
+                new TestCustomErrorClient(tomcat.getConnector().getLocalPort());
 
         client.reset();
         client.setRequest(new String[] {
@@ -294,6 +294,11 @@ public class TestDefaultServlet extends 
     }
 
     private static class TestCustomErrorClient extends SimpleHttpClient {
+
+        public TestCustomErrorClient(int port) {
+            setPort(port);
+        }
+
         @Override
         public boolean isResponseBodyOK() {
             return true;

Modified: tomcat/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java (original)
+++ tomcat/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java Mon Nov 28 23:16:42 2011
@@ -70,7 +70,7 @@ public abstract class SimpleHttpClient {
     private String responseBody;
     private boolean useContentLength;
 
-    public void setPort(int thePort) {
+    protected void setPort(int thePort) {
         port = thePort;
     }
 

Modified: tomcat/trunk/test/org/apache/catalina/startup/TomcatBaseTest.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/startup/TomcatBaseTest.java?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/startup/TomcatBaseTest.java (original)
+++ tomcat/trunk/test/org/apache/catalina/startup/TomcatBaseTest.java Mon Nov 28 23:16:42 2011
@@ -56,7 +56,6 @@ import org.apache.tomcat.util.buf.ByteCh
 public abstract class TomcatBaseTest extends LoggingBaseTest {
     private Tomcat tomcat;
     private boolean accessLogEnabled = false;
-    private static int port = 8000;
 
     public static final String TEMP_DIR = System.getProperty("java.io.tmpdir");
 
@@ -71,15 +70,7 @@ public abstract class TomcatBaseTest ext
      * Sub-classes need to know port so they can connect
      */
     public int getPort() {
-        return port;
-    }
-
-    /**
-     * Sub-classes may want to add connectors on a new port
-     */
-    public int getNextPort() {
-        port++;
-        return getPort();
+        return tomcat.getConnector().getLocalPort();
     }
 
     /**
@@ -106,9 +97,8 @@ public abstract class TomcatBaseTest ext
 
         String protocol = getProtocol();
         Connector connector = new Connector(protocol);
-        // If each test is running on same port - they
-        // may interfere with each other
-        connector.setPort(getNextPort());
+        // Use random free port
+        connector.setPort(0);
         // Mainly set to reduce timeouts during async tests
         connector.setAttribute("connectionTimeout", "3000");
         tomcat.getService().addConnector(connector);

Modified: tomcat/trunk/test/org/apache/coyote/http11/TestAbstractHttp11Processor.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http11/TestAbstractHttp11Processor.java?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/coyote/http11/TestAbstractHttp11Processor.java (original)
+++ tomcat/trunk/test/org/apache/coyote/http11/TestAbstractHttp11Processor.java Mon Nov 28 23:16:42 2011
@@ -53,8 +53,7 @@ public class TestAbstractHttp11Processor
             SimpleHttpClient.CRLF +
             "test=data";
 
-        Client client = new Client();
-        client.setPort(getPort());
+        Client client = new Client(tomcat.getConnector().getLocalPort());
         client.setRequest(new String[] {request});
 
         client.connect();
@@ -82,8 +81,7 @@ public class TestAbstractHttp11Processor
             SimpleHttpClient.CRLF +
             "test=data";
 
-        Client client = new Client();
-        client.setPort(getPort());
+        Client client = new Client(tomcat.getConnector().getLocalPort());
         client.setRequest(new String[] {request});
 
         client.connect();
@@ -113,8 +111,7 @@ public class TestAbstractHttp11Processor
             SimpleHttpClient.CRLF +
             "test=data";
 
-        Client client = new Client();
-        client.setPort(getPort());
+        Client client = new Client(tomcat.getConnector().getLocalPort());
         client.setRequest(new String[] {request});
 
         client.connect();
@@ -144,8 +141,7 @@ public class TestAbstractHttp11Processor
             SimpleHttpClient.CRLF +
             "test=data";
 
-        Client client = new Client();
-        client.setPort(getPort());
+        Client client = new Client(tomcat.getConnector().getLocalPort());
         client.setRequest(new String[] {request});
 
         client.connect();
@@ -174,8 +170,7 @@ public class TestAbstractHttp11Processor
             SimpleHttpClient.CRLF +
             "test=data";
 
-        Client client = new Client();
-        client.setPort(getPort());
+        Client client = new Client(tomcat.getConnector().getLocalPort());
         client.setRequest(new String[] {request});
 
         client.connect();
@@ -204,8 +199,7 @@ public class TestAbstractHttp11Processor
             "Host: any" + SimpleHttpClient.CRLF +
             SimpleHttpClient.CRLF;
 
-        final Client client = new Client();
-        client.setPort(getPort());
+        final Client client = new Client(tomcat.getConnector().getLocalPort());
         client.setRequest(new String[] {requestPart1, requestPart2});
         client.setRequestPause(1000);
         client.setUseContentLength(true);
@@ -246,6 +240,11 @@ public class TestAbstractHttp11Processor
     }
 
     private static final class Client extends SimpleHttpClient {
+
+        public Client(int port) {
+            setPort(port);
+        }
+
         @Override
         public boolean isResponseBodyOK() {
             return getResponseBody().contains("test - data");

Modified: tomcat/trunk/test/org/apache/coyote/http11/TestInternalInputBuffer.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http11/TestInternalInputBuffer.java?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/coyote/http11/TestInternalInputBuffer.java (original)
+++ tomcat/trunk/test/org/apache/coyote/http11/TestInternalInputBuffer.java Mon Nov 28 23:16:42 2011
@@ -45,7 +45,6 @@ public class TestInternalInputBuffer ext
     public void testBug48839() {
 
         Bug48839Client client = new Bug48839Client();
-        client.setPort(getPort());
 
         client.doRequest();
         assertTrue(client.isResponse200());
@@ -68,6 +67,7 @@ public class TestInternalInputBuffer ext
 
             try {
                 tomcat.start();
+                setPort(tomcat.getConnector().getLocalPort());
 
                 // Open connection
                 connect();
@@ -131,7 +131,6 @@ public class TestInternalInputBuffer ext
     public void testBug51557NoColon() {
 
         Bug51557Client client = new Bug51557Client("X-Bug51557NoColon");
-        client.setPort(getPort());
 
         client.doRequest();
         assertTrue(client.isResponse200());
@@ -170,7 +169,6 @@ public class TestInternalInputBuffer ext
 
         Bug51557Client client = new Bug51557Client("X-Bug=51557NoColon",
                 "foo" + SimpleHttpClient.CRLF + " bar");
-        client.setPort(getPort());
 
         client.doRequest();
         assertTrue(client.isResponse200());
@@ -184,7 +182,6 @@ public class TestInternalInputBuffer ext
 
         Bug51557Client client = new Bug51557Client("=X-Bug51557",
                 "invalid");
-        client.setPort(getPort());
 
         client.doRequest();
         assertTrue(client.isResponse200());
@@ -198,7 +195,6 @@ public class TestInternalInputBuffer ext
 
         Bug51557Client client = new Bug51557Client("X-Bug51557=",
                 "invalid");
-        client.setPort(getPort());
 
         client.doRequest();
         assertTrue(client.isResponse200());
@@ -211,7 +207,6 @@ public class TestInternalInputBuffer ext
         Bug51557Client client =
             new Bug51557Client("X-Bug" + s + "51557", "invalid");
 
-        client.setPort(getPort());
         client.doRequest();
         assertTrue(client.isResponse200());
         assertEquals("abcd", client.getResponseBody());
@@ -247,6 +242,7 @@ public class TestInternalInputBuffer ext
 
             try {
                 tomcat.start();
+                setPort(tomcat.getConnector().getLocalPort());
 
                 // Open connection
                 connect();

Modified: tomcat/trunk/test/org/apache/coyote/http11/filters/TestChunkedInputFilter.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http11/filters/TestChunkedInputFilter.java?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/coyote/http11/filters/TestChunkedInputFilter.java (original)
+++ tomcat/trunk/test/org/apache/coyote/http11/filters/TestChunkedInputFilter.java Mon Nov 28 23:16:42 2011
@@ -68,8 +68,8 @@ public class TestChunkedInputFilter exte
             "x-trailer: Test", "TestTest0123456789abcdefghijABCDEFGHIJopqrstuvwxyz" + SimpleHttpClient.CRLF +
             SimpleHttpClient.CRLF };
 
-        TrailerClient client = new TrailerClient();
-        client.setPort(getPort());
+        TrailerClient client =
+                new TrailerClient(tomcat.getConnector().getLocalPort());
         client.setRequest(request);
 
         client.connect();
@@ -109,8 +109,8 @@ public class TestChunkedInputFilter exte
             "x-trailer: Test" + SimpleHttpClient.CRLF +
             SimpleHttpClient.CRLF };
 
-        TrailerClient client = new TrailerClient();
-        client.setPort(getPort());
+        TrailerClient client =
+                new TrailerClient(tomcat.getConnector().getLocalPort());
         client.setRequest(request);
 
         client.connect();
@@ -149,8 +149,8 @@ public class TestChunkedInputFilter exte
             "0" + SimpleHttpClient.CRLF +
             SimpleHttpClient.CRLF;
 
-        TrailerClient client = new TrailerClient();
-        client.setPort(getPort());
+        TrailerClient client =
+                new TrailerClient(tomcat.getConnector().getLocalPort());
         client.setRequest(new String[] {request});
 
         client.connect();
@@ -193,6 +193,10 @@ public class TestChunkedInputFilter exte
 
     private static class TrailerClient extends SimpleHttpClient {
 
+        public TrailerClient(int port) {
+            setPort(port);
+        }
+
         @Override
         public boolean isResponseBodyOK() {
             return getResponseBody().contains("TestTestTest");

Modified: tomcat/trunk/test/org/apache/tomcat/util/http/TestCookiesAllowEquals.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/util/http/TestCookiesAllowEquals.java?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/tomcat/util/http/TestCookiesAllowEquals.java (original)
+++ tomcat/trunk/test/org/apache/tomcat/util/http/TestCookiesAllowEquals.java Mon Nov 28 23:16:42 2011
@@ -60,7 +60,7 @@ public class TestCookiesAllowEquals exte
 
             tomcat.start();
             // Open connection
-            setPort(tomcat.getConnector().getPort());
+            setPort(tomcat.getConnector().getLocalPort());
             connect();
 
             String[] request = new String[1];

Modified: tomcat/trunk/test/org/apache/tomcat/util/http/TestCookiesAllowHttpSeps.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/util/http/TestCookiesAllowHttpSeps.java?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/tomcat/util/http/TestCookiesAllowHttpSeps.java (original)
+++ tomcat/trunk/test/org/apache/tomcat/util/http/TestCookiesAllowHttpSeps.java Mon Nov 28 23:16:42 2011
@@ -58,7 +58,7 @@ public class TestCookiesAllowHttpSeps ex
 
             tomcat.start();
             // Open connection
-            setPort(tomcat.getConnector().getPort());
+            setPort(tomcat.getConnector().getLocalPort());
             connect();
 
             String[] request = new String[1];

Modified: tomcat/trunk/test/org/apache/tomcat/util/http/TestCookiesAllowNameOnly.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/util/http/TestCookiesAllowNameOnly.java?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/tomcat/util/http/TestCookiesAllowNameOnly.java (original)
+++ tomcat/trunk/test/org/apache/tomcat/util/http/TestCookiesAllowNameOnly.java Mon Nov 28 23:16:42 2011
@@ -59,7 +59,7 @@ public class TestCookiesAllowNameOnly ex
 
             tomcat.start();
             // Open connection
-            setPort(tomcat.getConnector().getPort());
+            setPort(tomcat.getConnector().getLocalPort());
             connect();
 
             String[] request = new String[1];

Modified: tomcat/trunk/test/org/apache/tomcat/util/http/TestCookiesDisallowEquals.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/util/http/TestCookiesDisallowEquals.java?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/tomcat/util/http/TestCookiesDisallowEquals.java (original)
+++ tomcat/trunk/test/org/apache/tomcat/util/http/TestCookiesDisallowEquals.java Mon Nov 28 23:16:42 2011
@@ -55,7 +55,7 @@ public class TestCookiesDisallowEquals e
 
             tomcat.start();
             // Open connection
-            setPort(tomcat.getConnector().getPort());
+            setPort(tomcat.getConnector().getLocalPort());
             connect();
 
             String[] request = new String[1];

Modified: tomcat/trunk/test/org/apache/tomcat/util/net/TestXxxEndpoint.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/util/net/TestXxxEndpoint.java?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/tomcat/util/net/TestXxxEndpoint.java (original)
+++ tomcat/trunk/test/org/apache/tomcat/util/net/TestXxxEndpoint.java Mon Nov 28 23:16:42 2011
@@ -165,9 +165,9 @@ public class TestXxxEndpoint extends Tom
         File appDir = new File(getBuildDirectory(), "webapps/examples");
         tomcat.addWebapp(null, "/examples", appDir.getAbsolutePath());
 
-        int port = getPort();
 
         tomcat.start();
+        int port = getPort();
 
         tomcat.getConnector().stop();
         Exception e = null;

Modified: tomcat/trunk/webapps/docs/config/ajp.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/ajp.xml?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/config/ajp.xml (original)
+++ tomcat/trunk/webapps/docs/config/ajp.xml Mon Nov 28 23:16:42 2011
@@ -143,7 +143,10 @@
       <p>The TCP port number on which this <strong>Connector</strong>
       will create a server socket and await incoming connections.  Your
       operating system will allow only one server application to listen
-      to a particular port number on a particular IP address.</p>
+      to a particular port number on a particular IP address. If the special
+      value of 0 (zero) is used, then Tomcat will select a free port at random
+      to use for this connector. This is typically only useful in embedded and
+      testing applications.</p>
     </attribute>
 
     <attribute name="protocol" required="false">

Modified: tomcat/trunk/webapps/docs/config/http.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/http.xml?rev=1207692&r1=1207691&r2=1207692&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/config/http.xml (original)
+++ tomcat/trunk/webapps/docs/config/http.xml Mon Nov 28 23:16:42 2011
@@ -141,7 +141,10 @@
       <p>The TCP port number on which this <strong>Connector</strong>
       will create a server socket and await incoming connections.  Your
       operating system will allow only one server application to listen
-      to a particular port number on a particular IP address.</p>
+      to a particular port number on a particular IP address. If the special
+      value of 0 (zero) is used, then Tomcat will select a free port at random
+      to use for this connector. This is typically only useful in embedded and
+      testing applications.</p>
     </attribute>
 
     <attribute name="protocol" required="false">



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org