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: [email protected]
For additional commands, e-mail: [email protected]