Author: markt
Date: Thu Nov  1 15:06:53 2018
New Revision: 1845482

URL: http://svn.apache.org/viewvc?rev=1845482&view=rev
Log:
Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=61171
Add the portOffset attribute to the Server element which is added to the 
configured shutdown and Connector ports.
Based on a patch by Marek Czernek.
THis closes #125

Added:
    tomcat/trunk/java/org/apache/catalina/startup/AddPortOffsetRule.java   
(with props)
Modified:
    tomcat/trunk/java/org/apache/catalina/Server.java
    tomcat/trunk/java/org/apache/catalina/connector/Connector.java
    tomcat/trunk/java/org/apache/catalina/connector/mbeans-descriptors.xml
    tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties
    tomcat/trunk/java/org/apache/catalina/core/StandardServer.java
    tomcat/trunk/java/org/apache/catalina/core/mbeans-descriptors.xml
    tomcat/trunk/java/org/apache/catalina/mbeans/MBeanFactory.java
    tomcat/trunk/java/org/apache/catalina/realm/RealmBase.java
    tomcat/trunk/java/org/apache/catalina/startup/Catalina.java
    tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties
    tomcat/trunk/java/org/apache/catalina/valves/RemoteAddrValve.java
    tomcat/trunk/java/org/apache/catalina/valves/RemoteHostValve.java
    tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java
    tomcat/trunk/java/org/apache/coyote/LocalStrings.properties
    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/LocalStrings.properties
    tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java
    tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java
    tomcat/trunk/webapps/docs/changelog.xml
    tomcat/trunk/webapps/docs/config/server.xml

Modified: tomcat/trunk/java/org/apache/catalina/Server.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/Server.java?rev=1845482&r1=1845481&r2=1845482&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/Server.java (original)
+++ tomcat/trunk/java/org/apache/catalina/Server.java Thu Nov  1 15:06:53 2018
@@ -73,6 +73,9 @@ public interface Server extends Lifecycl
 
     /**
      * @return the port number we listen to for shutdown commands.
+     *
+     * @see #getPortOffset()
+     * @see #getPortWithOffset()
      */
     public int getPort();
 
@@ -81,9 +84,37 @@ public interface Server extends Lifecycl
      * Set the port number we listen to for shutdown commands.
      *
      * @param port The new port number
+     *
+     * @see #setPortOffset(int)
      */
     public void setPort(int port);
 
+    /**
+     * Get the number that offsets the port used for shutdown commands.
+     * For example, if port is 8005, and portOffset is 1000,
+     * the server listens at 9005.
+     *
+     * @return the port offset
+     */
+    public int getPortOffset();
+
+    /**
+     * Set the number that offsets the server port used for shutdown commands.
+     * For example, if port is 8005, and you set portOffset to 1000,
+     * connector listens at 9005.
+     *
+     * @param portOffset sets the port offset
+     */
+    public void setPortOffset(int portOffset);
+
+    /**
+     * Get the actual port on which server is listening for the shutdown 
commands.
+     * If you do not set port offset, port is returned. If you set
+     * port offset, port offset + port is returned.
+     *
+     * @return the port with offset
+     */
+    public int getPortWithOffset();
 
     /**
      * @return the address on which we listen to for shutdown commands.

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=1845482&r1=1845481&r2=1845482&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/Connector.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/Connector.java Thu Nov  1 
15:06:53 2018
@@ -536,6 +536,37 @@ public class Connector extends Lifecycle
     }
 
 
+    public int getPortOffset() {
+        // Try shortcut that should work for nearly all uses first as it does
+        // not use reflection and is therefore faster.
+        if (protocolHandler instanceof AbstractProtocol<?>) {
+            return ((AbstractProtocol<?>) protocolHandler).getPortOffset();
+        }
+        // Fall back for custom protocol handlers not based on AbstractProtocol
+        Object port = getProperty("portOffset");
+        if (port instanceof Integer) {
+            return ((Integer) port).intValue();
+        }
+        // Usually means an invalid protocol has been configured.
+        return 0;
+    }
+
+
+    public void setPortOffset(int portOffset) {
+        setProperty("portOffset", String.valueOf(portOffset));
+    }
+
+
+    public int getPortWithOffset() {
+        int port = getPort();
+        // Zero is a special case and negative values are invalid
+        if (port > 0) {
+            return port + getPortOffset();
+        }
+        return port;
+    }
+
+
     /**
      * @return the port number on which this connector is listening to 
requests.
      * If the special value for {@link #getPort} of zero is used then this 
method
@@ -645,6 +676,11 @@ public class Connector extends Lifecycle
     }
 
 
+    public int getRedirectPortWithOffset() {
+        return getRedirectPort() + getPortOffset();
+    }
+
+
     /**
      * @return the scheme that will be assigned to requests received
      * through this connector.  Default value is "http".
@@ -850,7 +886,7 @@ public class Connector extends Lifecycle
         StringBuilder sb = new StringBuilder("type=");
         sb.append(type);
         sb.append(",port=");
-        int port = getPort();
+        int port = getPortWithOffset();
         if (port > 0) {
             sb.append(port);
         } else {
@@ -951,9 +987,9 @@ public class Connector extends Lifecycle
     protected void startInternal() throws LifecycleException {
 
         // Validate settings before starting
-        if (getPort() < 0) {
+        if (getPortWithOffset() < 0) {
             throw new LifecycleException(sm.getString(
-                    "coyoteConnector.invalidPort", 
Integer.valueOf(getPort())));
+                    "coyoteConnector.invalidPort", 
Integer.valueOf(getPortWithOffset())));
         }
 
         setState(LifecycleState.STARTING);
@@ -1017,7 +1053,7 @@ public class Connector extends Lifecycle
         StringBuilder sb = new StringBuilder("Connector[");
         sb.append(getProtocol());
         sb.append('-');
-        int port = getPort();
+        int port = getPortWithOffset();
         if (port > 0) {
             sb.append(port);
         } else {

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=1845482&r1=1845481&r2=1845482&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/mbeans-descriptors.xml 
(original)
+++ tomcat/trunk/java/org/apache/catalina/connector/mbeans-descriptors.xml Thu 
Nov  1 15:06:53 2018
@@ -130,8 +130,18 @@
                  type="int"/>
 
     <attribute   name="port"
-          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"/>
+          description="The port number (excluding any offset) 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"/>
+
+    <attribute   name="portOffset"
+          description="The offset that will be applied to port to determine 
the actual port number used."
+                 type="int"
+            writeable="false"/>
+
+    <attribute   name="portWithOffset"
+          description="The actual port number (including any offset) on which 
this connector is configured to listen for requests."
+                 type="int"
+            writeable="false"/>
 
     <!-- Common -->
     <attribute   name="processorCache"
@@ -157,9 +167,14 @@
                  type="int"/>
 
     <attribute   name="redirectPort"
-          description="The redirect port for non-SSL to SSL redirects"
+          description="The redirect port (excluding any offset) for non-SSL to 
SSL redirects"
                  type="int"/>
 
+    <attribute   name="redirectPortWithOffset"
+          description="The actual redirect port (including any offset) for 
non-SSL to SSL redirects."
+                 type="int"
+            writeable="false"/>
+
     <attribute   name="scheme"
           description="Protocol name for this Connector (http, https)"
                  type="java.lang.String"/>

Modified: tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties?rev=1845482&r1=1845481&r2=1845482&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties [UTF-8] 
(original)
+++ tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties [UTF-8] 
Thu Nov  1 15:06:53 2018
@@ -197,6 +197,8 @@ standardHost.nullName=Host name is requi
 standardHost.problematicAppBase=Using an empty string for appBase on host 
[{0}] will set it to CATALINA_BASE, which is a bad idea
 standardHostValue.customStatusFailed=Custom error page [{0}] could not be 
dispatched correctly
 standardServer.accept.timeout=The socket listening for the shutdown command 
experienced an unexpected timeout [{0}] milliseconds after the call to 
accept(). Is this an instance of bug 56684?
+standardServer.awaitSocket.fail=Failed to create server shutdown socket on 
address [{0}] and port [{1}] (base port [{2}] and offset [{3}])
+standardServer.portOffset.invalid=The value [{0}] for portOffset is not valid 
as portOffset may not be negative
 standardServer.shutdownViaPort=A valid shutdown command was received via the 
shutdown port. Stopping the Server instance.
 standardServer.storeConfig.notAvailable=No StoreConfig implementation was 
registered as an MBean named [{0}] so no configuration could be saved. A 
suitable MBean is normally registered via the StoreConfigLifecycleListener.
 standardService.engine.startFailed=Failed to start associated Engine

Modified: tomcat/trunk/java/org/apache/catalina/core/StandardServer.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardServer.java?rev=1845482&r1=1845481&r2=1845482&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardServer.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardServer.java Thu Nov  1 
15:06:53 2018
@@ -113,6 +113,8 @@ public final class StandardServer extend
      */
     private int port = 8005;
 
+    private int portOffset = 0;
+
     /**
      * The address on which we wait for shutdown commands.
      */
@@ -277,6 +279,35 @@ public final class StandardServer extend
     }
 
 
+    @Override
+    public int getPortOffset() {
+        return portOffset;
+    }
+
+
+    @Override
+    public void setPortOffset(int portOffset) {
+        if (portOffset < 0) {
+            throw new IllegalArgumentException(
+                    sm.getString("standardServer.portOffset.invalid", 
Integer.valueOf(portOffset)));
+        }
+        this.portOffset = portOffset;
+    }
+
+
+    @Override
+    public int getPortWithOffset() {
+        // Non-positive port values have special meanings and the offset should
+        // not apply.
+        int port = getPort();
+        if (port > 0) {
+            return port + getPortOffset();
+        } else {
+            return port;
+        }
+    }
+
+
     /**
      * Return the address on which we listen to for shutdown commands.
      */
@@ -396,11 +427,11 @@ public final class StandardServer extend
     @Override
     public void await() {
         // Negative values - don't wait on port - tomcat is embedded or we 
just don't like ports
-        if( port == -2 ) {
+        if (getPortWithOffset() == -2) {
             // undocumented yet - for embedding apps that are around, alive.
             return;
         }
-        if( port==-1 ) {
+        if (getPortWithOffset() == -1) {
             try {
                 awaitThread = Thread.currentThread();
                 while(!stopAwait) {
@@ -418,12 +449,12 @@ public final class StandardServer extend
 
         // Set up a server socket to wait on
         try {
-            awaitSocket = new ServerSocket(port, 1,
+            awaitSocket = new ServerSocket(getPortWithOffset(), 1,
                     InetAddress.getByName(address));
         } catch (IOException e) {
-            log.error("StandardServer.await: create[" + address
-                               + ":" + port
-                               + "]: ", e);
+            log.error(sm.getString("standardServer.awaitSocket.fail", address,
+                    String.valueOf(getPortWithOffset()), 
String.valueOf(getPort()),
+                    String.valueOf(getPortOffset())), e);
             return;
         }
 
@@ -927,5 +958,4 @@ public final class StandardServer extend
     protected final String getObjectNameKeyProperties() {
         return "type=Server";
     }
-
 }

Modified: tomcat/trunk/java/org/apache/catalina/core/mbeans-descriptors.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/mbeans-descriptors.xml?rev=1845482&r1=1845481&r2=1845482&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/mbeans-descriptors.xml (original)
+++ tomcat/trunk/java/org/apache/catalina/core/mbeans-descriptors.xml Thu Nov  
1 15:06:53 2018
@@ -1305,9 +1305,18 @@
                type="java.lang.Object"/>
 
     <attribute name="port"
-               description="TCP port for shutdown messages"
+               description="TCP port (excluding any offset) for shutdown 
messages"
                type="int"/>
 
+    <attribute name="portOffset"
+               description="The offset applied to port and to the port 
attributes of any nested connectors"
+               type="int"/>
+
+    <attribute name="portWithOffset"
+               description="Actual TCP port (including any offset) for 
shutdown messages"
+               type="int"
+               writeable="false"/>
+
     <attribute name="serverInfo"
                description="Tomcat server release identifier"
                type="java.lang.String"

Modified: tomcat/trunk/java/org/apache/catalina/mbeans/MBeanFactory.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/mbeans/MBeanFactory.java?rev=1845482&r1=1845481&r2=1845482&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/mbeans/MBeanFactory.java (original)
+++ tomcat/trunk/java/org/apache/catalina/mbeans/MBeanFactory.java Thu Nov  1 
15:06:53 2018
@@ -699,7 +699,7 @@ public class MBeanFactory {
             if (objConnAddress != null) {
                 connAddress = ((InetAddress) objConnAddress).getHostAddress();
             }
-            String connPort = ""+conns[i].getPort();
+            String connPort = ""+conns[i].getPortWithOffset();
 
             if (address == null) {
                 // Don't combine this with outer if or we could get an NPE in

Modified: tomcat/trunk/java/org/apache/catalina/realm/RealmBase.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/realm/RealmBase.java?rev=1845482&r1=1845481&r2=1845482&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/realm/RealmBase.java (original)
+++ tomcat/trunk/java/org/apache/catalina/realm/RealmBase.java Thu Nov  1 
15:06:53 2018
@@ -1016,7 +1016,7 @@ public abstract class RealmBase extends
             return true;
         }
         // Initialize variables we need to determine the appropriate action
-        int redirectPort = request.getConnector().getRedirectPort();
+        int redirectPort = request.getConnector().getRedirectPortWithOffset();
 
         // Is redirecting disabled?
         if (redirectPort <= 0) {

Added: tomcat/trunk/java/org/apache/catalina/startup/AddPortOffsetRule.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/AddPortOffsetRule.java?rev=1845482&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/AddPortOffsetRule.java (added)
+++ tomcat/trunk/java/org/apache/catalina/startup/AddPortOffsetRule.java Thu 
Nov  1 15:06:53 2018
@@ -0,0 +1,36 @@
+/*
+ * 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.catalina.startup;
+
+import org.apache.catalina.Server;
+import org.apache.catalina.connector.Connector;
+import org.apache.tomcat.util.digester.Rule;
+import org.xml.sax.Attributes;
+
+public class AddPortOffsetRule extends Rule {
+
+    // Set portOffset on all the connectors based on portOffset in the Server
+    @Override
+    public void begin(String namespace, String name, Attributes attributes) 
throws Exception {
+
+        Connector conn = (Connector) digester.peek();
+        Server server = (Server) digester.peek(2);
+
+        int portOffset = server.getPortOffset();
+        conn.setPortOffset(portOffset);
+    }
+}
\ No newline at end of file

Propchange: tomcat/trunk/java/org/apache/catalina/startup/AddPortOffsetRule.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: tomcat/trunk/java/org/apache/catalina/startup/Catalina.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/Catalina.java?rev=1845482&r1=1845481&r2=1845482&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/Catalina.java (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/Catalina.java Thu Nov  1 
15:06:53 2018
@@ -35,6 +35,7 @@ import org.apache.catalina.Container;
 import org.apache.catalina.LifecycleException;
 import org.apache.catalina.LifecycleState;
 import org.apache.catalina.Server;
+import org.apache.catalina.connector.Connector;
 import org.apache.catalina.core.StandardContext;
 import org.apache.catalina.security.SecurityConfig;
 import org.apache.juli.ClassLoaderLogManager;
@@ -281,6 +282,7 @@ public class Catalina {
         digester.setValidating(false);
         digester.setRulesValidation(true);
         Map<Class<?>, List<String>> fakeAttributes = new HashMap<>();
+        // Ignore className on all elements
         List<String> objectAttrs = new ArrayList<>();
         objectAttrs.add("className");
         fakeAttributes.put(Object.class, objectAttrs);
@@ -288,6 +290,10 @@ public class Catalina {
         List<String> contextAttrs = new ArrayList<>();
         contextAttrs.add("source");
         fakeAttributes.put(StandardContext.class, contextAttrs);
+        // Ignore Connector attribute used internally but set on Server
+        List<String> connectorAttrs = new ArrayList<>();
+        connectorAttrs.add("portOffset");
+        fakeAttributes.put(Connector.class, connectorAttrs);
         digester.setFakeAttributes(fakeAttributes);
         digester.setUseContextClassLoader(true);
 
@@ -350,6 +356,8 @@ public class Catalina {
                             "addConnector",
                             "org.apache.catalina.connector.Connector");
 
+        digester.addRule("Server/Service/Connector", new AddPortOffsetRule());
+
         digester.addObjectCreate("Server/Service/Connector/SSLHostConfig",
                                  "org.apache.tomcat.util.net.SSLHostConfig");
         digester.addSetProperties("Server/Service/Connector/SSLHostConfig");
@@ -499,8 +507,8 @@ public class Catalina {
 
         // Stop the existing server
         s = getServer();
-        if (s.getPort()>0) {
-            try (Socket socket = new Socket(s.getAddress(), s.getPort());
+        if (s.getPortWithOffset() > 0) {
+            try (Socket socket = new Socket(s.getAddress(), 
s.getPortWithOffset());
                     OutputStream stream = socket.getOutputStream()) {
                 String shutdown = s.getShutdown();
                 for (int i = 0; i < shutdown.length(); i++) {
@@ -508,9 +516,9 @@ public class Catalina {
                 }
                 stream.flush();
             } catch (ConnectException ce) {
-                log.error(sm.getString("catalina.stopServer.connectException",
-                                       s.getAddress(),
-                                       String.valueOf(s.getPort())));
+                log.error(sm.getString("catalina.stopServer.connectException", 
s.getAddress(),
+                        String.valueOf(s.getPortWithOffset()), 
String.valueOf(s.getPort()),
+                        String.valueOf(s.getPortOffset())));
                 log.error("Catalina.stop: ", ce);
                 System.exit(1);
             } catch (IOException e) {

Modified: tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties?rev=1845482&r1=1845481&r2=1845482&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties 
[UTF-8] (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties 
[UTF-8] Thu Nov  1 15:06:53 2018
@@ -18,7 +18,7 @@ catalina.noCluster=Cluster RuleSet not f
 catalina.serverStartFail=The required Server component failed to start so 
Tomcat is unable to start.
 catalina.shutdownHookFail=The shutdown hook experienced an error while trying 
to stop the server
 catalina.stopServer=No shutdown port configured. Shut down server through OS 
signal. Server not shut down.
-catalina.stopServer.connectException=Could not contact [{0}:[{1}]]. Tomcat may 
not be running.
+catalina.stopServer.connectException=Could not contact [{0}:{1}] (base port 
[{2}] and offset [{3}]). Tomcat may not be running.
 contextConfig.altDDNotFound=alt-dd file [{0}] not found
 contextConfig.annotationsStackOverflow=Unable to complete the scan for 
annotations for web application [{0}] due to a StackOverflowError. Possible 
root causes include a too low setting for -Xss and illegal cyclic inheritance 
dependencies. The class hierarchy being processed was [{1}]
 contextConfig.applicationUrl=Unable to determine URL for application web.xml

Modified: tomcat/trunk/java/org/apache/catalina/valves/RemoteAddrValve.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/valves/RemoteAddrValve.java?rev=1845482&r1=1845481&r2=1845482&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/valves/RemoteAddrValve.java (original)
+++ tomcat/trunk/java/org/apache/catalina/valves/RemoteAddrValve.java Thu Nov  
1 15:06:53 2018
@@ -45,7 +45,8 @@ public final class RemoteAddrValve exten
     public void invoke(Request request, Response response) throws IOException, 
ServletException {
         String property;
         if (getAddConnectorPort()) {
-            property = request.getRequest().getRemoteAddr() + ";" + 
request.getConnector().getPort();
+            property = request.getRequest().getRemoteAddr() + ";" +
+                    request.getConnector().getPortWithOffset();
         } else {
             property = request.getRequest().getRemoteAddr();
         }

Modified: tomcat/trunk/java/org/apache/catalina/valves/RemoteHostValve.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/valves/RemoteHostValve.java?rev=1845482&r1=1845481&r2=1845482&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/valves/RemoteHostValve.java (original)
+++ tomcat/trunk/java/org/apache/catalina/valves/RemoteHostValve.java Thu Nov  
1 15:06:53 2018
@@ -43,7 +43,8 @@ public final class RemoteHostValve exten
     public void invoke(Request request, Response response) throws IOException, 
ServletException {
         String property;
         if (getAddConnectorPort()) {
-            property = request.getRequest().getRemoteHost() + ";" + 
request.getConnector().getPort();
+            property = request.getRequest().getRemoteHost() + ";" +
+                    request.getConnector().getPortWithOffset();
         } else {
             property = request.getRequest().getRemoteHost();
         }

Modified: tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java?rev=1845482&r1=1845481&r2=1845482&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java (original)
+++ tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java Thu Nov  1 
15:06:53 2018
@@ -277,6 +277,15 @@ public abstract class AbstractProtocol<S
     }
 
 
+    public int getPortOffset() { return endpoint.getPortOffset(); }
+    public void setPortOffset(int portOffset) {
+        endpoint.setPortOffset(portOffset);
+    }
+
+
+    public int getPortWithOffset() { return endpoint.getPortWithOffset(); }
+
+
     public int getLocalPort() { return endpoint.getLocalPort(); }
 
     /*
@@ -339,7 +348,7 @@ public abstract class AbstractProtocol<S
             name.append(getAddress().getHostAddress());
             name.append('-');
         }
-        int port = getPort();
+        int port = getPortWithOffset();
         if (port == 0) {
             // Auto binding is in use. Check if port is known
             name.append("auto-");
@@ -489,9 +498,9 @@ public abstract class AbstractProtocol<S
 
         StringBuilder name = new StringBuilder(getDomain());
         name.append(":type=ProtocolHandler,port=");
-        int port = getPort();
+        int port = getPortWithOffset();
         if (port > 0) {
-            name.append(getPort());
+            name.append(port);
         } else {
             name.append("auto-");
             name.append(getNameIndex());
@@ -517,6 +526,7 @@ public abstract class AbstractProtocol<S
     public void init() throws Exception {
         if (getLog().isInfoEnabled()) {
             getLog().info(sm.getString("abstractProtocolHandler.init", 
getName()));
+            logPortOffset();
         }
 
         if (oname == null) {
@@ -545,6 +555,7 @@ public abstract class AbstractProtocol<S
     public void start() throws Exception {
         if (getLog().isInfoEnabled()) {
             getLog().info(sm.getString("abstractProtocolHandler.start", 
getName()));
+            logPortOffset();
         }
 
         endpoint.start();
@@ -591,6 +602,7 @@ public abstract class AbstractProtocol<S
     public void stop() throws Exception {
         if(getLog().isInfoEnabled()) {
             getLog().info(sm.getString("abstractProtocolHandler.stop", 
getName()));
+            logPortOffset();
         }
 
         if (asyncTimeout != null) {
@@ -605,6 +617,7 @@ public abstract class AbstractProtocol<S
     public void destroy() throws Exception {
         if(getLog().isInfoEnabled()) {
             getLog().info(sm.getString("abstractProtocolHandler.destroy", 
getName()));
+            logPortOffset();
         }
 
         try {
@@ -637,6 +650,14 @@ public abstract class AbstractProtocol<S
     }
 
 
+    private void logPortOffset() {
+        if (getPort() != getPortWithOffset()) {
+            getLog().info(sm.getString("abstractProtocolHandler.portOffset", 
getName(),
+                    String.valueOf(getPort()), 
String.valueOf(getPortOffset())));
+        }
+    }
+
+
     // ------------------------------------------- Connection handler base 
class
 
     protected static class ConnectionHandler<S> implements 
AbstractEndpoint.Handler<S> {

Modified: tomcat/trunk/java/org/apache/coyote/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/LocalStrings.properties?rev=1845482&r1=1845481&r2=1845482&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/LocalStrings.properties [UTF-8] 
(original)
+++ tomcat/trunk/java/org/apache/coyote/LocalStrings.properties [UTF-8] Thu Nov 
 1 15:06:53 2018
@@ -36,6 +36,7 @@ abstractProtocol.mbeanDeregistrationFail
 abstractProtocolHandler.getAttribute=Get attribute [{0}] with value [{1}]
 abstractProtocolHandler.setAttribute=Set attribute [{0}] with value [{1}]
 abstractProtocolHandler.init=Initializing ProtocolHandler [{0}]
+abstractProtocolHandler.portOffset=ProtocolHandler [{0}] is configured with a 
base port of [{1}] and a port offset of [{2}]
 abstractProtocolHandler.start=Starting ProtocolHandler [{0}]
 abstractProtocolHandler.pause=Pausing ProtocolHandler [{0}]
 abstractProtocolHandler.resume=Resuming ProtocolHandler [{0}]

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=1845482&r1=1845481&r2=1845482&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java Thu Nov  
1 15:06:53 2018
@@ -456,6 +456,27 @@ public abstract class AbstractEndpoint<S
     public void setPort(int port ) { this.port=port; }
 
 
+    private int portOffset = 0;
+    public int getPortOffset() { return portOffset; }
+    public void setPortOffset(int portOffset ) {
+        if (portOffset < 0) {
+            throw new IllegalArgumentException(
+                    sm.getString("endpoint.portOffset.invalid", 
Integer.valueOf(portOffset)));
+        }
+        this.portOffset = portOffset;
+    }
+
+
+    public int getPortWithOffset() {
+        // Zero is a special case and negative values are invalid
+        int port = getPort();
+        if (port > 0) {
+            return port + getPortOffset();
+        }
+        return port;
+    }
+
+
     public final int getLocalPort() {
         try {
             InetSocketAddress localAddress = getLocalAddress();
@@ -922,7 +943,8 @@ public abstract class AbstractEndpoint<S
         } catch(Throwable t) {
             ExceptionUtils.handleThrowable(t);
             if (getLog().isDebugEnabled()) {
-                getLog().debug(sm.getString("endpoint.debug.unlock.fail", "" + 
getPort()), t);
+                getLog().debug(sm.getString(
+                        "endpoint.debug.unlock.fail", 
String.valueOf(getPortWithOffset())), t);
             }
         }
     }

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=1845482&r1=1845481&r2=1845482&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Thu Nov  1 
15:06:53 2018
@@ -313,8 +313,7 @@ public class AprEndpoint extends Abstrac
             }
          }
 
-        long inetAddress = Address.info(addressStr, family,
-                getPort(), 0, rootPool);
+        long inetAddress = Address.info(addressStr, family, 
getPortWithOffset(), 0, rootPool);
         // Create the APR server socket
         serverSock = Socket.create(Address.getInfo(inetAddress).family,
                 Socket.SOCK_STREAM,

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/LocalStrings.properties?rev=1845482&r1=1845481&r2=1845482&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/LocalStrings.properties 
[UTF-8] (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/LocalStrings.properties 
[UTF-8] Thu Nov  1 15:06:53 2018
@@ -61,6 +61,7 @@ endpoint.poll.initfail=Poller creation f
 endpoint.poll.fail=Critical poller failure (restarting poller): [{0}] [{1}]
 endpoint.poll.error=Unexpected poller error
 endpoint.pollerThreadStop=The poller thread failed to stop in a timely manner
+endpoint.portOffset.invalid=The value [{0}] for portOffset is not valid as 
portOffset may not be negative
 endpoint.process.fail=Error allocating socket processor
 endpoint.processing.fail=Error running socket processor
 endpoint.removeDefaultSslHostConfig=The default SSLHostConfig (named [{0}]) 
may not be removed

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java?rev=1845482&r1=1845481&r2=1845482&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java Thu Nov  1 
15:06:53 2018
@@ -142,7 +142,7 @@ public class Nio2Endpoint extends Abstra
 
         serverSock = AsynchronousServerSocketChannel.open(threadGroup);
         socketProperties.setProperties(serverSock);
-        InetSocketAddress addr = (getAddress()!=null?new 
InetSocketAddress(getAddress(),getPort()):new InetSocketAddress(getPort()));
+        InetSocketAddress addr = new InetSocketAddress(getAddress(), 
getPortWithOffset());
         serverSock.bind(addr,getAcceptCount());
 
         // Initialize thread count defaults for acceptor, poller

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=1845482&r1=1845481&r2=1845482&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Thu Nov  1 
15:06:53 2018
@@ -232,7 +232,7 @@ public class NioEndpoint extends Abstrac
         if (!getUseInheritedChannel()) {
             serverSock = ServerSocketChannel.open();
             socketProperties.setProperties(serverSock.socket());
-            InetSocketAddress addr = (getAddress()!=null?new 
InetSocketAddress(getAddress(),getPort()):new InetSocketAddress(getPort()));
+            InetSocketAddress addr = new InetSocketAddress(getAddress(), 
getPortWithOffset());
             serverSock.socket().bind(addr,getAcceptCount());
         } else {
             // Retrieve the channel provided by the OS
@@ -323,7 +323,8 @@ public class NioEndpoint extends Abstrac
     @Override
     public void unbind() throws Exception {
         if (log.isDebugEnabled()) {
-            log.debug("Destroy initiated for "+new 
InetSocketAddress(getAddress(),getPort()));
+            log.debug("Destroy initiated for " +
+                    new InetSocketAddress(getAddress(),getPortWithOffset()));
         }
         if (running) {
             stop();
@@ -336,7 +337,8 @@ public class NioEndpoint extends Abstrac
         }
         selectorPool.close();
         if (log.isDebugEnabled()) {
-            log.debug("Destroy completed for "+new 
InetSocketAddress(getAddress(),getPort()));
+            log.debug("Destroy completed for " +
+                    new InetSocketAddress(getAddress(), getPortWithOffset()));
         }
     }
 

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1845482&r1=1845481&r2=1845482&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Thu Nov  1 15:06:53 2018
@@ -55,6 +55,12 @@
         now take effect a short time after the file is saved. (markt)
       </add>
       <add>
+        <bug>61171</bug>: Add the <code>portOffset</code> attribute to the
+        <code>Server</code> element which is added to the configured shutdown
+        and <code>Connector</code> ports. Based on a patch by Marek Czernek.
+        (markt)
+      </add>
+      <add>
         <bug>61692</bug>: Add the ability to control which HTTP methods are
         handled by the CGI Servlet via a new initialization parameter
         <code>cgiMethods</code>. (markt)

Modified: tomcat/trunk/webapps/docs/config/server.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/server.xml?rev=1845482&r1=1845481&r2=1845482&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/config/server.xml (original)
+++ tomcat/trunk/webapps/docs/config/server.xml Thu Nov  1 15:06:53 2018
@@ -75,6 +75,12 @@
       gracefully.</p>
     </attribute>
 
+    <attribute name="portOffset" required="false">
+      <p>The offset to apply to <code>port</code> and to the ports of any
+      nested connectors. It must be a non-negative integer. If not specified,
+      the default value of <code>0</code> is used.</p>
+    </attribute>
+
     <attribute name="shutdown" required="true">
       <p>The command string that must be received via a TCP/IP connection
       to the specified port number, in order to shut down Tomcat.</p>



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

Reply via email to