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