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-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org