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