You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2020/05/04 13:12:01 UTC
[tomcat] branch 8.5.x updated: Align with master & 9.0.x
This is an automated email from the ASF dual-hosted git repository.
markt pushed a commit to branch 8.5.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/8.5.x by this push:
new ec318b5 Align with master & 9.0.x
ec318b5 is described below
commit ec318b5bbb865296b2c77ac34142d9423be4a03d
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Mon May 4 14:11:40 2020 +0100
Align with master & 9.0.x
Review of classes impacted by PR #285
---
.../apache/catalina/core/ApplicationContext.java | 4 +-
.../apache/catalina/ha/tcp/ReplicationValve.java | 2 +-
.../catalina/session/LocalStrings.properties | 5 +
.../catalina/session/PersistentManagerBase.java | 58 ++++-----
.../valves/rewrite/QuotedStringTokenizer.java | 135 +++++++++++++++++++++
.../catalina/valves/rewrite/RewriteRule.java | 2 +-
.../catalina/valves/rewrite/RewriteValve.java | 2 +-
test/org/apache/catalina/valves/Benchmarks.java | 2 +-
8 files changed, 172 insertions(+), 38 deletions(-)
diff --git a/java/org/apache/catalina/core/ApplicationContext.java b/java/org/apache/catalina/core/ApplicationContext.java
index fab9fac..70c783d 100644
--- a/java/org/apache/catalina/core/ApplicationContext.java
+++ b/java/org/apache/catalina/core/ApplicationContext.java
@@ -1010,7 +1010,7 @@ public class ApplicationContext implements ServletContext {
Connector[] connectors = service.findConnectors();
// Need at least one SSL enabled connector to use the SSL session ID.
for (Connector connector : connectors) {
- if (Boolean.TRUE.equals(connector.getAttribute("SSLEnabled"))) {
+ if (Boolean.TRUE.equals(connector.getProperty("SSLEnabled"))) {
supportedSessionTrackingModes.add(SessionTrackingMode.SSL);
break;
}
@@ -1278,7 +1278,7 @@ public class ApplicationContext implements ServletContext {
Container[] wrappers = context.findChildren();
for (Container wrapper : wrappers) {
- result.put(((Wrapper) wrapper).getName(),
+ result.put(wrapper.getName(),
new ApplicationServletRegistration(
(Wrapper) wrapper, context));
}
diff --git a/java/org/apache/catalina/ha/tcp/ReplicationValve.java b/java/org/apache/catalina/ha/tcp/ReplicationValve.java
index 9e91cfb..6eed956 100644
--- a/java/org/apache/catalina/ha/tcp/ReplicationValve.java
+++ b/java/org/apache/catalina/ha/tcp/ReplicationValve.java
@@ -318,7 +318,7 @@ public class ReplicationValve
Context context = request.getContext();
boolean isCrossContext = context != null
&& context instanceof StandardContext
- && ((StandardContext) context).getCrossContext();
+ && context.getCrossContext();
try {
if(isCrossContext) {
if(log.isDebugEnabled()) {
diff --git a/java/org/apache/catalina/session/LocalStrings.properties b/java/org/apache/catalina/session/LocalStrings.properties
index 289b272..62a8b49 100644
--- a/java/org/apache/catalina/session/LocalStrings.properties
+++ b/java/org/apache/catalina/session/LocalStrings.properties
@@ -44,9 +44,14 @@ managerBase.setContextNotNew=It is illegal to call setContext() to change the Co
persistentManager.backupMaxIdle=Backing up session [{0}] to Store, idle for [{1}] seconds
persistentManager.deserializeError=Error deserializing Session [{0}]
+persistentManager.isLoadedError=Error checking if session [{0}] is loaded in memory
persistentManager.loading=Loading [{0}] persisted sessions
+persistentManager.removeError=Error removing session [{0}] from the store
persistentManager.serializeError=Error serializing Session [{0}]: [{1}]
+persistentManager.storeClearError=Error clearning all sessions from the store
persistentManager.storeKeysException=Unable to determine the list of session IDs for sessions in the session store, assuming that the store is empty
+persistentManager.storeLoadError=Error swapping in sessions from the store
+persistentManager.storeLoadKeysError=Error loading sessions keys from the store
persistentManager.storeSizeException=Unable to determine the number of sessions in the session store, assuming that the store is empty
persistentManager.swapIn=Swapping session [{0}] in from Store
persistentManager.swapInException=Exception in the Store during swapIn: [{0}]
diff --git a/java/org/apache/catalina/session/PersistentManagerBase.java b/java/org/apache/catalina/session/PersistentManagerBase.java
index 2b9b92d..9f52c44 100644
--- a/java/org/apache/catalina/session/PersistentManagerBase.java
+++ b/java/org/apache/catalina/session/PersistentManagerBase.java
@@ -310,12 +310,13 @@ public abstract class PersistentManagerBase extends ManagerBase
* @return {@code true}, if the session id is loaded in memory
* otherwise {@code false} is returned
*/
- public boolean isLoaded( String id ){
+ public boolean isLoaded(String id) {
try {
- if ( super.findSession(id) != null )
+ if (super.findSession(id) != null) {
return true;
+ }
} catch (IOException e) {
- log.error("checking isLoaded for id, " + id + ", "+e.getMessage(), e);
+ log.error(sm.getString("persistentManager.isLoadedError", id), e);
}
return false;
}
@@ -398,19 +399,17 @@ public abstract class PersistentManagerBase extends ManagerBase
return;
try {
- if (SecurityUtil.isPackageProtectionEnabled()){
- try{
+ if (SecurityUtil.isPackageProtectionEnabled()) {
+ try {
AccessController.doPrivileged(new PrivilegedStoreClear());
- }catch(PrivilegedActionException ex){
- Exception exception = ex.getException();
- log.error("Exception clearing the Store: " + exception,
- exception);
+ } catch (PrivilegedActionException e) {
+ log.error(sm.getString("persistentManager.storeClearError"), e.getException());
}
} else {
store.clear();
}
} catch (IOException e) {
- log.error("Exception clearing the Store: " + e, e);
+ log.error(sm.getString("persistentManager.storeClearError"), e);
}
}
@@ -528,21 +527,19 @@ public abstract class PersistentManagerBase extends ManagerBase
String[] ids = null;
try {
- if (SecurityUtil.isPackageProtectionEnabled()){
- try{
- ids = AccessController.doPrivileged(
- new PrivilegedStoreKeys());
- }catch(PrivilegedActionException ex){
- Exception exception = ex.getException();
- log.error("Exception in the Store during load: "
- + exception, exception);
+ if (SecurityUtil.isPackageProtectionEnabled()) {
+ try {
+ ids = AccessController.doPrivileged(new PrivilegedStoreKeys());
+ } catch (PrivilegedActionException e) {
+ log.error(sm.getString("persistentManager.storeLoadKeysError"),
+ e.getException());
return;
}
} else {
ids = store.keys();
}
} catch (IOException e) {
- log.error("Can't load sessions from store, " + e.getMessage(), e);
+ log.error(sm.getString("persistentManager.storeLoadKeysError"), e);
return;
}
@@ -557,7 +554,7 @@ public abstract class PersistentManagerBase extends ManagerBase
try {
swapIn(id);
} catch (IOException e) {
- log.error("Failed load session from store, " + e.getMessage(), e);
+ log.error(sm.getString("persistentManager.storeLoadError"), e);
}
}
@@ -587,19 +584,17 @@ public abstract class PersistentManagerBase extends ManagerBase
*/
protected void removeSession(String id){
try {
- if (SecurityUtil.isPackageProtectionEnabled()){
- try{
+ if (SecurityUtil.isPackageProtectionEnabled()) {
+ try {
AccessController.doPrivileged(new PrivilegedStoreRemove(id));
- }catch(PrivilegedActionException ex){
- Exception exception = ex.getException();
- log.error("Exception in the Store during removeSession: "
- + exception, exception);
+ } catch (PrivilegedActionException e) {
+ log.error(sm.getString("persistentManager.removeError"), e.getException());
}
} else {
- store.remove(id);
+ store.remove(id);
}
} catch (IOException e) {
- log.error("Exception removing session " + e.getMessage(), e);
+ log.error(sm.getString("persistentManager.removeError"), e);
}
}
@@ -837,15 +832,14 @@ public abstract class PersistentManagerBase extends ManagerBase
if (exception instanceof IOException) {
throw (IOException) exception;
}
- log.error("Exception in the Store during writeSession: "
- + exception, exception);
+ log.error(sm.getString("persistentManager.serializeError",
+ session.getIdInternal(), exception));
}
} else {
store.save(session);
}
} catch (IOException e) {
- log.error(sm.getString
- ("persistentManager.serializeError", session.getIdInternal(), e));
+ log.error(sm.getString("persistentManager.serializeError", session.getIdInternal(), e));
throw e;
}
diff --git a/java/org/apache/catalina/valves/rewrite/QuotedStringTokenizer.java b/java/org/apache/catalina/valves/rewrite/QuotedStringTokenizer.java
new file mode 100644
index 0000000..00aaa4a
--- /dev/null
+++ b/java/org/apache/catalina/valves/rewrite/QuotedStringTokenizer.java
@@ -0,0 +1,135 @@
+/*
+ * 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.valves.rewrite;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+public class QuotedStringTokenizer {
+
+ private Iterator<String> tokenIterator;
+ private int tokenCount;
+ private int returnedTokens = 0;
+
+ enum WordMode {
+ SPACES, QUOTED, ESCAPED, SIMPLE, COMMENT
+ }
+
+ public QuotedStringTokenizer(String text) {
+ List<String> tokens;
+ if (text != null) {
+ tokens = tokenizeText(text);
+ } else {
+ tokens = Collections.emptyList();
+ }
+ this.tokenCount = tokens.size();
+ this.tokenIterator = tokens.iterator();
+ }
+
+ private List<String> tokenizeText(String inputText) {
+ List<String> tokens = new ArrayList<>();
+ int pos = 0;
+ int length = inputText.length();
+ WordMode currentMode = WordMode.SPACES;
+ StringBuilder currentToken = new StringBuilder();
+ while (pos < length) {
+ char currentChar = inputText.charAt(pos);
+ switch (currentMode) {
+ case SPACES:
+ currentMode = handleSpaces(currentToken, currentChar);
+ break;
+ case QUOTED:
+ currentMode = handleQuoted(tokens, currentToken, currentChar);
+ break;
+ case ESCAPED:
+ currentToken.append(currentChar);
+ currentMode = WordMode.QUOTED;
+ break;
+ case SIMPLE:
+ currentMode = handleSimple(tokens, currentToken, currentChar);
+ break;
+ case COMMENT:
+ if (currentChar == '\r' || currentChar == '\n') {
+ currentMode = WordMode.SPACES;
+ }
+ break;
+ default:
+ throw new IllegalStateException(
+ "Couldn't tokenize text '" + inputText + "' after position " + pos + " from mode " + currentMode);
+ }
+ pos++;
+ }
+ String possibleLastToken = currentToken.toString();
+ if (!possibleLastToken.isEmpty()) {
+ tokens.add(possibleLastToken);
+ }
+ return tokens;
+ }
+
+ private WordMode handleSimple(List<String> tokens, StringBuilder currentToken, char currentChar) {
+ if (Character.isWhitespace(currentChar)) {
+ tokens.add(currentToken.toString());
+ currentToken.setLength(0);
+ return WordMode.SPACES;
+ } else {
+ currentToken.append(currentChar);
+ }
+ return WordMode.SIMPLE;
+ }
+
+ private WordMode handleQuoted(List<String> tokens, StringBuilder currentToken, char currentChar) {
+ if (currentChar == '"') {
+ tokens.add(currentToken.toString());
+ currentToken.setLength(0);
+ return WordMode.SPACES;
+ } else if (currentChar == '\\') {
+ return WordMode.ESCAPED;
+ } else {
+ currentToken.append(currentChar);
+ }
+ return WordMode.QUOTED;
+ }
+
+ private WordMode handleSpaces(StringBuilder currentToken, char currentChar) {
+ if (!Character.isWhitespace(currentChar)) {
+ if (currentChar == '"') {
+ return WordMode.QUOTED;
+ } else if (currentChar == '#') {
+ return WordMode.COMMENT;
+ } else {
+ currentToken.append(currentChar);
+ return WordMode.SIMPLE;
+ }
+ }
+ return WordMode.SPACES;
+ }
+
+ public boolean hasMoreTokens() {
+ return tokenIterator.hasNext();
+ }
+
+ public String nextToken() {
+ returnedTokens++;
+ return tokenIterator.next();
+ }
+
+ public int countTokens() {
+ return tokenCount - returnedTokens;
+ }
+}
diff --git a/java/org/apache/catalina/valves/rewrite/RewriteRule.java b/java/org/apache/catalina/valves/rewrite/RewriteRule.java
index 40f903c..833a12c 100644
--- a/java/org/apache/catalina/valves/rewrite/RewriteRule.java
+++ b/java/org/apache/catalina/valves/rewrite/RewriteRule.java
@@ -299,7 +299,7 @@ public class RewriteRule {
/**
* Prefix Substitution with http://thishost[:thisport]/ (which makes the
- * new URL a URI) to force a external redirection. If no code is given
+ * new URL a URI) to force an external redirection. If no code is given
* an HTTP response of 302 (FOUND, previously MOVED TEMPORARILY) is used.
* If you want to use other response codes in the range 300-399 just
* specify them as a number or use one of the following symbolic names:
diff --git a/java/org/apache/catalina/valves/rewrite/RewriteValve.java b/java/org/apache/catalina/valves/rewrite/RewriteValve.java
index ffbc961..78cbe7c 100644
--- a/java/org/apache/catalina/valves/rewrite/RewriteValve.java
+++ b/java/org/apache/catalina/valves/rewrite/RewriteValve.java
@@ -631,7 +631,7 @@ public class RewriteValve extends ValveBase {
* @return The condition, rule or map resulting from parsing the line
*/
public static Object parse(String line) {
- StringTokenizer tokenizer = new StringTokenizer(line);
+ QuotedStringTokenizer tokenizer = new QuotedStringTokenizer(line);
if (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken();
if (token.equals("RewriteCond")) {
diff --git a/test/org/apache/catalina/valves/Benchmarks.java b/test/org/apache/catalina/valves/Benchmarks.java
index 898ab50..752ebad 100644
--- a/test/org/apache/catalina/valves/Benchmarks.java
+++ b/test/org/apache/catalina/valves/Benchmarks.java
@@ -195,7 +195,7 @@ public class Benchmarks {
} catch (Throwable t) {
index = 0; // cannot happen, in theory
}
- return (months[index]);
+ return months[index];
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org