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 2019/07/30 14:26:33 UTC

[tomcat] branch 7.0.x updated (1a772c4 -> df2cd77)

This is an automated email from the ASF dual-hosted git repository.

markt pushed a change to branch 7.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git.


    from 1a772c4  Deprecate FastHttpDateFormat.formatDate(long, DateFormat)
     new 86ee8fc  Align with 8.5.x. Javadoc
     new a8db40e  Align with 8.5.x: i18n improvements
     new c8e2e04  Align with master. Use FastDateFormat to parse date headers
     new df2cd77  Align with 8.5.x

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../org/apache/catalina/filters/ExpiresFilter.java | 72 ++++++++++++++--------
 java/org/apache/catalina/filters/FilterBase.java   |  2 +-
 .../catalina/filters/LocalStrings.properties       | 50 ++++++++-------
 .../catalina/filters/LocalStrings_es.properties    | 47 ++++++++------
 .../catalina/filters/LocalStrings_fr.properties    | 51 ++++++++++++++-
 .../catalina/filters/LocalStrings_ja.properties    | 65 +++++++++++++++++++
 .../catalina/filters/LocalStrings_ru.properties}   |  7 ++-
 .../apache/catalina/filters/RemoteIpFilter.java    | 44 +++----------
 .../apache/catalina/filters/WebdavFixFilter.java   | 15 ++---
 9 files changed, 236 insertions(+), 117 deletions(-)
 create mode 100644 java/org/apache/catalina/filters/LocalStrings_ja.properties
 copy java/{javax/servlet/LocalStrings_ja.properties => org/apache/catalina/filters/LocalStrings_ru.properties} (71%)


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


[tomcat] 03/04: Align with master. Use FastDateFormat to parse date headers

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch 7.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git

commit c8e2e046494e91a2126c7ba7ef3b94b8362b7a0f
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Tue Jul 30 15:19:29 2019 +0100

    Align with master. Use FastDateFormat to parse date headers
---
 .../apache/catalina/filters/RemoteIpFilter.java    | 33 +++-------------------
 1 file changed, 4 insertions(+), 29 deletions(-)

diff --git a/java/org/apache/catalina/filters/RemoteIpFilter.java b/java/org/apache/catalina/filters/RemoteIpFilter.java
index b399854..14340c9 100644
--- a/java/org/apache/catalina/filters/RemoteIpFilter.java
+++ b/java/org/apache/catalina/filters/RemoteIpFilter.java
@@ -17,18 +17,13 @@
 package org.apache.catalina.filters;
 
 import java.io.IOException;
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.Date;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Locale;
 import java.util.Map;
 import java.util.regex.Pattern;
 
@@ -46,6 +41,7 @@ import org.apache.catalina.AccessLog;
 import org.apache.catalina.Globals;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.http.FastHttpDateFormat;
 import org.apache.tomcat.util.res.StringManager;
 
 /**
@@ -444,18 +440,6 @@ public class RemoteIpFilter implements Filter {
 
     public static class XForwardedRequest extends HttpServletRequestWrapper {
 
-        static final ThreadLocal<SimpleDateFormat[]> threadLocalDateFormats = new ThreadLocal<SimpleDateFormat[]>() {
-            @Override
-            protected SimpleDateFormat[] initialValue() {
-                return new SimpleDateFormat[] {
-                    new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US),
-                    new SimpleDateFormat("EEEEEE, dd-MMM-yy HH:mm:ss zzz", Locale.US),
-                    new SimpleDateFormat("EEE MMMM d HH:mm:ss yyyy", Locale.US)
-                };
-
-            }
-        };
-
         protected Map<String, List<String>> headers;
 
         protected int localPort;
@@ -492,20 +476,11 @@ public class RemoteIpFilter implements Filter {
             if (value == null) {
                 return -1;
             }
-            DateFormat[] dateFormats = threadLocalDateFormats.get();
-            Date date = null;
-            for (int i = 0; ((i < dateFormats.length) && (date == null)); i++) {
-                DateFormat dateFormat = dateFormats[i];
-                try {
-                    date = dateFormat.parse(value);
-                } catch (ParseException ex) {
-                    // Ignore
-                }
-            }
-            if (date == null) {
+            long date = FastHttpDateFormat.parseDate(value);
+            if (date == -1) {
                 throw new IllegalArgumentException(value);
             }
-            return date.getTime();
+            return date;
         }
 
         @Override


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


[tomcat] 02/04: Align with 8.5.x: i18n improvements

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch 7.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git

commit a8db40e5af495da0d854bf670e1e25d7198edff9
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Tue Jul 30 15:14:20 2019 +0100

    Align with 8.5.x: i18n improvements
---
 .../org/apache/catalina/filters/ExpiresFilter.java |  5 +-
 java/org/apache/catalina/filters/FilterBase.java   |  2 +-
 .../catalina/filters/LocalStrings.properties       | 50 +++++++++--------
 .../catalina/filters/LocalStrings_es.properties    | 47 +++++++++-------
 .../catalina/filters/LocalStrings_fr.properties    | 51 ++++++++++++++++-
 .../catalina/filters/LocalStrings_ja.properties    | 65 ++++++++++++++++++++++
 ...gs_fr.properties => LocalStrings_ru.properties} |  6 +-
 .../apache/catalina/filters/RemoteIpFilter.java    |  8 ++-
 .../apache/catalina/filters/WebdavFixFilter.java   | 15 ++---
 9 files changed, 188 insertions(+), 61 deletions(-)

diff --git a/java/org/apache/catalina/filters/ExpiresFilter.java b/java/org/apache/catalina/filters/ExpiresFilter.java
index 983fabb..b4dce2e 100644
--- a/java/org/apache/catalina/filters/ExpiresFilter.java
+++ b/java/org/apache/catalina/filters/ExpiresFilter.java
@@ -1055,9 +1055,8 @@ public class ExpiresFilter extends FilterBase {
             try {
                 ints[i] = Integer.parseInt(intAsString);
             } catch (NumberFormatException e) {
-                throw new RuntimeException("Exception parsing number '" + i +
-                        "' (zero based) of comma delimited list '" +
-                        commaDelimitedInts + "'");
+                throw new RuntimeException(sm.getString("expiresFilter.numberError",
+                        Integer.valueOf(i), commaDelimitedInts));
             }
         }
         return ints;
diff --git a/java/org/apache/catalina/filters/FilterBase.java b/java/org/apache/catalina/filters/FilterBase.java
index 5b438d6..9360c91 100644
--- a/java/org/apache/catalina/filters/FilterBase.java
+++ b/java/org/apache/catalina/filters/FilterBase.java
@@ -32,7 +32,7 @@ import org.apache.tomcat.util.res.StringManager;
  */
 public abstract class FilterBase implements Filter {
 
-    protected static final StringManager sm = StringManager.getManager(Constants.Package);
+    protected static final StringManager sm = StringManager.getManager(FilterBase.class);
 
     protected abstract Log getLogger();
 
diff --git a/java/org/apache/catalina/filters/LocalStrings.properties b/java/org/apache/catalina/filters/LocalStrings.properties
index 01d1a6a..41a4bef 100644
--- a/java/org/apache/catalina/filters/LocalStrings.properties
+++ b/java/org/apache/catalina/filters/LocalStrings.properties
@@ -25,28 +25,29 @@ corsFilter.wrongType2=Expects a HttpServletRequest object of type [{0}] or [{1}]
 
 csrfPrevention.invalidRandomClass=Unable to create Random source using class [{0}]
 
-expiresFilter.exceptionProcessingParameter=Exception processing configuration parameter "{0}":"{1}"
-expiresFilter.expirationHeaderAlreadyDefined=Request "{0}" with response status "{1}" content-type "{2}", expiration header already defined
-expiresFilter.filterInitialized=Filter initialized with configuration {0}
-expiresFilter.invalidDurationNumber=Invalid duration (number) "{0}" in directive "{1}"
-expiresFilter.invalidDurationUnit=Invalid duration unit (years|months|weeks|days|hours|minutes|seconds) "{0}" in directive "{1}"
-expiresFilter.noDurationFound=Duration not found in directive "{0}"
-expiresFilter.noDurationUnitAfterAmount=Duration unit not found after amount "{0}" in directive "{1}"
-expiresFilter.noExpirationConfigured=Request "{0}" with response status "{1}" content-type "{2}", no expiration configured
-expiresFilter.noExpirationConfiguredForContentType=No Expires configuration found for content-type "{0}"
-expiresFilter.responseAlreadyCommited=Request "{0}", can not apply ExpiresFilter on already committed response.
-expiresFilter.setExpirationDate=Request "{0}" with response status "{1}" content-type "{2}", set expiration date {3}
-expiresFilter.skippedStatusCode=Request "{0}" with response status "{1}" content-type "{1}", skip expiration header generation for given status
-expiresFilter.startingPointInvalid=Invalid starting point (access|now|modification|a<seconds>|m<seconds>) "{0}" in directive "{1}"
-expiresFilter.startingPointNotFound=Starting point (access|now|modification|a<seconds>|m<seconds>) not found in directive "{0}"
-expiresFilter.unknownParameterIgnored=Unknown parameter "{0}" with value "{1}" is ignored !
-expiresFilter.unsupportedStartingPoint=Unsupported startingPoint "{0}"
-expiresFilter.useDefaultConfiguration=Use default {0} for content-type "{1}" returns {2}
-expiresFilter.useMatchingConfiguration=Use {0} matching "{1}" for content-type "{2}" returns {3}
-
-filterbase.noSuchProperty=The property "{0}" is not defined for filters of type "{1}"
-
-http.403=Access to the specified resource ({0}) has been forbidden.
+expiresFilter.exceptionProcessingParameter=Exception processing configuration parameter [{0}]:[{1}]
+expiresFilter.expirationHeaderAlreadyDefined=Request [{0}] with response status [{1}] content-type [{2}], expiration header already defined
+expiresFilter.filterInitialized=Filter initialized with configuration [{0}]
+expiresFilter.invalidDurationNumber=Invalid duration (number) [{0}] in directive [{1}]
+expiresFilter.invalidDurationUnit=Invalid duration unit (years|months|weeks|days|hours|minutes|seconds) [{0}] in directive [{1}]
+expiresFilter.noDurationFound=Duration not found in directive [{0}]
+expiresFilter.noDurationUnitAfterAmount=Duration unit not found after amount [{0}] in directive [{1}]
+expiresFilter.noExpirationConfigured=Request [{0}] with response status [{1}] content-type [{2}], no expiration configured
+expiresFilter.noExpirationConfiguredForContentType=No Expires configuration found for content-type [{0}]
+expiresFilter.numberError=Exception parsing number at position [{0}] (zero based) in comma delimited list [{1}]
+expiresFilter.responseAlreadyCommited=Request [{0}], cannot apply ExpiresFilter on already committed response.
+expiresFilter.setExpirationDate=Request [{0}] with response status [{1}] content-type [{2}], set expiration date [{3}]
+expiresFilter.skippedStatusCode=Request [{0}] with response status [{1}] content-type [{1}], skip expiration header generation for given status
+expiresFilter.startingPointInvalid=Invalid starting point (access|now|modification|a<seconds>|m<seconds>) [{0}] in directive [{1}]
+expiresFilter.startingPointNotFound=Starting point (access|now|modification|a<seconds>|m<seconds>) not found in directive [{0}]
+expiresFilter.unknownParameterIgnored=Unknown parameter [{0}] with value [{1}] is ignored !
+expiresFilter.unsupportedStartingPoint=Unsupported startingPoint [{0}]
+expiresFilter.useDefaultConfiguration=Use default [{0}] for content-type [{1}] returns [{2}]
+expiresFilter.useMatchingConfiguration=Use [{0}] matching [{1}] for content-type [{2}] returns [{3}]
+
+filterbase.noSuchProperty=The property [{0}] is not defined for filters of type [{1}]
+
+http.403=Access to the specified resource [{0}] has been forbidden.
 
 httpHeaderSecurityFilter.clickjack.invalid=An invalid value [{0}] was specified for the anti click-jacking header
 httpHeaderSecurityFilter.committed=Unable to add HTTP headers since response is already committed on entry to the HTTP header security Filter
@@ -54,6 +55,11 @@ httpHeaderSecurityFilter.committed=Unable to add HTTP headers since response is
 remoteCidrFilter.invalid=Invalid configuration provided for [{0}]. See previous messages for details.
 remoteCidrFilter.noRemoteIp=Client does not have an IP address. Request denied.
 
+remoteIpFilter.invalidNumber=Illegal number for parameter [{0}]: [{1}]
+
 requestFilter.deny=Denied request for [{0}] based on property [{1}]
 
 restCsrfPreventionFilter.invalidNonce=CSRF nonce validation failed
+
+webDavFilter.xpProblem=WebdavFixFilter: the XP-x64-SP2 client is known not to work with WebDAV Servlet
+webDavFilter.xpRootContext=WebdavFixFilter: the XP-x64-SP2 client will only work with the root context
diff --git a/java/org/apache/catalina/filters/LocalStrings_es.properties b/java/org/apache/catalina/filters/LocalStrings_es.properties
index f60df73..cf6199c 100644
--- a/java/org/apache/catalina/filters/LocalStrings_es.properties
+++ b/java/org/apache/catalina/filters/LocalStrings_es.properties
@@ -15,23 +15,30 @@
 
 addDefaultCharset.unsupportedCharset=El conjunto especificado de caracteres [{0}] no se encuentra soportado
 
-csrfPrevention.invalidRandomClass=No pude crear fuente al azar usando la clase [{0}]
-
-expiresFilter.exceptionProcessingParameter=Excepción al procesar parámetro de configuración "{0}":"{1}"
-expiresFilter.expirationHeaderAlreadyDefined=Ya se ha definido cabecera de expiración para el requerimiento "{0}" con status de respuesta "{1}" y content-type "{2}"
-expiresFilter.filterInitialized=Filtro inicializado con configuración {0}
-expiresFilter.noExpirationConfigured=No se ha configurado expiración para el requerimiento "{0}" con status de respuesta "{1}" y content-type "{2}"
-expiresFilter.noExpirationConfiguredForContentType=No se ha hallado configuración de Expiración para content-type "{0}"
-expiresFilter.responseAlreadyCommited=El requerimiento "{0}", no puede aplicar ExpiresFilter en respuesta ya acometida.
-expiresFilter.setExpirationDate=El requerimiento "{0}" con status de respuesta "{1}" y content-type "{2}", pone fecha de expiración a {3}
-expiresFilter.skippedStatusCode=Generación de cabecera de expiración saltada para el requerimiento "{0}" con status de respuesta "{1}" y content-type "{2}"
-expiresFilter.startingPointInvalid=Punto de arranque inválido (access|now|modification|a<seconds>|m<seconds>) "{0}" en la directiva "{1}"
-expiresFilter.startingPointNotFound=Punto de Arranque (access|now|modification|a<seconds>|m<seconds>) no hallado en la directiva "{0}"
-expiresFilter.unknownParameterIgnored=¡Se ignora el parámetro desconocido "{0}" con valor "{1}" especificado!
-expiresFilter.unsupportedStartingPoint=No soportado startingPoint "{0}"
-expiresFilter.useDefaultConfiguration=El uso de {0} por defecto para content-type "{1}" devuelve {2}
-expiresFilter.useMatchingConfiguration=El Uso de {0} coincidente con "{1}" para content-type "{2}" devuelve {3}
-
-filterbase.noSuchProperty=La propiedad "{0}" no está definida para los filtros del tipo "{1}"
-
-http.403=El acceso al recurso especificado ({0}) ha sido prohibido.
+corsFilter.invalidPreflightMaxAge=Incapáz de procesar preflightMaxAge
+corsFilter.nullRequestType=Objeto CORSRequestType es nulo\n
+
+csrfPrevention.invalidRandomClass=No se puede crear fuente aleatórea usando la clase [{0}]
+
+expiresFilter.exceptionProcessingParameter=Excepción al procesar parámetro de configuración [{0}]:[{1}]
+expiresFilter.expirationHeaderAlreadyDefined=Ya se ha definido cabecera de expiración para el requerimiento [{0}] con status de respuesta [{1}] y content-type [{2}]
+expiresFilter.filterInitialized=Filtro inicializado con configuración [{0}]
+expiresFilter.noExpirationConfigured=No se ha configurado expiración para el requerimiento [{0}] con status de respuesta [{1}] y content-type [{2}]
+expiresFilter.noExpirationConfiguredForContentType=No se ha hallado configuración de Expiración para content-type [{0}]
+expiresFilter.responseAlreadyCommited=El requerimiento [{0}], no puede aplicar ExpiresFilter en respuesta ya acometida.
+expiresFilter.setExpirationDate=El requerimiento [{0}] con status de respuesta [{1}] y content-type [{2}], pone fecha de expiración a [{3}]
+expiresFilter.skippedStatusCode=Generación de cabecera de expiración saltada para el requerimiento [{0}] con status de respuesta [{1}] y content-type [{2}]
+expiresFilter.startingPointInvalid=Punto de arranque inválido (access|now|modification|a<seconds>|m<seconds>) [{0}] en la directiva [{1}]
+expiresFilter.startingPointNotFound=Punto de Arranque (access|now|modification|a<seconds>|m<seconds>) no hallado en la directiva [{0}]
+expiresFilter.unknownParameterIgnored=¡Se ignora el parámetro desconocido [{0}] con valor [{1}] especificado!
+expiresFilter.unsupportedStartingPoint=startingPoint [{0}] no soportado
+expiresFilter.useDefaultConfiguration=El uso de [{0}] por defecto para content-type [{1}] devuelve [{2}]
+expiresFilter.useMatchingConfiguration=El Uso de [{0}] coincidente con [{1}] para content-type [{2}] devuelve [{3}]
+
+filterbase.noSuchProperty=La propiedad [{0}] no está definida para los filtros del tipo [{1}]
+
+http.403=El acceso al recurso especificado [{0}] ha sido prohibido.
+
+httpHeaderSecurityFilter.clickjack.invalid=An invalid value [{0}] was specified for the anti click-jacking header
+
+requestFilter.deny=Solicitud [{0}] denegada debido a propiedad [{1}]
diff --git a/java/org/apache/catalina/filters/LocalStrings_fr.properties b/java/org/apache/catalina/filters/LocalStrings_fr.properties
index 0bfcd68..e2bfee6 100644
--- a/java/org/apache/catalina/filters/LocalStrings_fr.properties
+++ b/java/org/apache/catalina/filters/LocalStrings_fr.properties
@@ -13,4 +13,53 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-http.403=L''accès à la ressource demandée ({0}) a été interdit.
+addDefaultCharset.unsupportedCharset=Le jeu de caractères [{0}] spécifié n''est pas supporté
+
+corsFilter.invalidPreflightMaxAge=Incapable d'analyser "preflightMaxAge"
+corsFilter.invalidSupportsCredentials=Il est interdit de configurer supportsCredentials=[true] alors que allowedOrigins=[*]
+corsFilter.nullRequest=L'objet HttpServletRequest est nul
+corsFilter.nullRequestType=L'objet CORSRequestType est nul
+corsFilter.onlyHttp=CORS ne supporte pas des requêtes ou des réponses non HTTP
+corsFilter.wrongType1=Attente d''un objet HttpServletRequest de type [{0}]
+corsFilter.wrongType2=Attendu un object HttpServletRequest de type [{0}] ou [{1}]
+
+csrfPrevention.invalidRandomClass=Impossible de créer une source aléatoire ("Random source") à l''aide de la classe [{0}]
+
+expiresFilter.exceptionProcessingParameter=Erreur lors du traitement du paramètre de configuration [{0}]:[{1}]
+expiresFilter.expirationHeaderAlreadyDefined=Requête [{0}] de statut de réponse [{1}] et de type de contenu ("content-type") [{2}], en-tête d''expiration déjà défini
+expiresFilter.filterInitialized=Le filtre a été initialisé avec la configuration [{0}]
+expiresFilter.invalidDurationNumber=Durée (nombre) invalide [{0}] dans la directive [{1}]
+expiresFilter.invalidDurationUnit=Unité de durée invalide (years|months|weeks|days|hours|minutes|seconds) [{0}] dans la directive [{1}]
+expiresFilter.noDurationFound=La durée n''a pas été trouvée dans la directive [{0}]
+expiresFilter.noDurationUnitAfterAmount=L''unité de durée n''a pas été trouvée après le nombre [{0}] dans la directive [{1}]
+expiresFilter.noExpirationConfigured=Requête [{0}] avec statut de réponse [{1}] et content-type [{2}], pas d''expiration configurée
+expiresFilter.noExpirationConfiguredForContentType=La configuration "Expires" pour le type de contenu [{0}] n''est pas trouvée.
+expiresFilter.numberError=Erreur lors de l''analyse du nombre à la position [{0}] (basée sur zéro) de la liste délimitée par une virgule [{1}]
+expiresFilter.responseAlreadyCommited=Impossible d''appliquer le ExpiresFilter pour la requête [{0}] car la réponse a déjà été envoyée
+expiresFilter.setExpirationDate=La requête [{0}] avec le status de réponse [{1}] content-type [{2}], a fixé la date d''expiration [{3}]
+expiresFilter.skippedStatusCode=La requête [{0}] avec le code de réponse [{1}] content-type [{2}], l''en-tête expiration ne sera pas généré pour ce statut
+expiresFilter.startingPointInvalid=Point de départ invalide (access|now|modification|a<secondes>|m<secondes>) [{0}] dans la directive [{1}]\n
+expiresFilter.startingPointNotFound=Le point de départ (access|now|modification|a<seconds>|m<seconds>) n''est pas présent dans la directive [{0}]
+expiresFilter.unknownParameterIgnored=Le paramètre inconnu [{0}] dont la valeur est [{1}] est ignoré
+expiresFilter.unsupportedStartingPoint=startingPoint [{0}] non supporté.
+expiresFilter.useDefaultConfiguration=Utilisation du défaut [{0}] pour le content-type [{1}] qui renvoie [{2}]
+expiresFilter.useMatchingConfiguration=Utilisation de [{0}], satisfaisant [{1}] pour le content-type [{2}] et retournant [{3}]
+
+filterbase.noSuchProperty=La propriété [{0}] n''est pas définie pour les filtres du type [{1}]
+
+http.403=L''accès à la ressource demandée [{0}] a été interdit.
+
+httpHeaderSecurityFilter.clickjack.invalid=Une valeur invalide [{0}] a été spécifiée pour le header "anti click-jacking"
+httpHeaderSecurityFilter.committed=Impossible d'ajouter les en-têtes HTTP car la réponse a déjà été envoyée avant l'invocation du filtre de sécurité des en-têtes
+
+remoteCidrFilter.invalid=Une configuration invalide a été fournie pour [{0}], voir les précédents messages pour les détails
+remoteCidrFilter.noRemoteIp=Le client n'a pas d'adresse IP.  Requête rejetée.
+
+remoteIpFilter.invalidNumber=Nombre invalide pour le paramètre [{0}]: [{1}]
+
+requestFilter.deny=Requête refusée pour [{0}] basée sur la propriété [{1}]
+
+restCsrfPreventionFilter.invalidNonce=La validation du nonce de CSRF a échouée
+
+webDavFilter.xpProblem=WebdavFixFilter: le client de XP-x64-SP2 est réputé ne pas fonctionner avec le Servlet WebDAV
+webDavFilter.xpRootContext=WebdavFixFilter: le client de XP-x64-SP2 ne peut fonctionner que le le contexte racine
diff --git a/java/org/apache/catalina/filters/LocalStrings_ja.properties b/java/org/apache/catalina/filters/LocalStrings_ja.properties
new file mode 100644
index 0000000..1f6de03
--- /dev/null
+++ b/java/org/apache/catalina/filters/LocalStrings_ja.properties
@@ -0,0 +1,65 @@
+# 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.
+
+addDefaultCharset.unsupportedCharset=指定された文字セット[{0}]はサポートされていません。
+
+corsFilter.invalidPreflightMaxAge=preflightMaxAgeを解析出来ません
+corsFilter.invalidSupportsCredentials=allowedOrigins = [*]の場合、supportsCredentials = [true]を設定することはできません。
+corsFilter.nullRequest=HttpServletRequestオブジェクトがnullです
+corsFilter.nullRequestType=CORSRequestType オブジェクトが null です。
+corsFilter.onlyHttp=CORSは非HTTPリクエストまたはレスポンスをサポートしていません。
+corsFilter.wrongType1=[{0}]型のHttpServletRequestオブジェクトが必要です
+corsFilter.wrongType2=[{0}]型または[{1}]型のHttpServletRequest オブジェクトが必要です。
+
+csrfPrevention.invalidRandomClass=乱数生成器クラス [{0}] のインスタンスが作成できませんでした。
+
+expiresFilter.exceptionProcessingParameter=構成パラメータ[{0}]:[{1}]処理中の例外
+expiresFilter.expirationHeaderAlreadyDefined=レスポンスステータス[{1}]がコンテンツタイプ[{2}]のリクエスト[{0}、expirationヘッダーがすでに定義されています。
+expiresFilter.filterInitialized=設定[{0}]で初期化されたFilter
+expiresFilter.invalidDurationNumber=ディレクティブ[{1}]の無効な期間(number)[{0}]
+expiresFilter.invalidDurationUnit=  ディレクティブ[{1}]で期間ユニットが無効です。(years|months|weeks|days|hours|minutes|seconds) [{0}] \n
+expiresFilter.noDurationFound=ディレクティブ[{0}]にDuration が見つかりません
+expiresFilter.noDurationUnitAfterAmount=ディレクティブ[{1}]のamount[{0}]の後にDuration 単位が見つかりません。
+expiresFilter.noExpirationConfigured=リクエスト [{0}] に対するレスポンスは応答コード [{1} コンテントタイプ [{2}] です。有効期限は未設定です。
+expiresFilter.noExpirationConfiguredForContentType=Content-Type [{0}] に有効期限が設定されていません。
+expiresFilter.numberError=カンマ区切りリスト [{1}] の [{0}] 番目(ゼロ開始)の数値を解析中の例外
+expiresFilter.responseAlreadyCommited=リクエスト[{0}]は、すでにコミットされたレスポンスに対してExpiresFilterを適用できません。
+expiresFilter.setExpirationDate=レスポンスステータス[{1}]のコンテンツタイプ[{2}]、有効期限[{3}]を設定するリクエスト[{0}]
+expiresFilter.skippedStatusCode=レスポンスステータス[{1}] content-type [{1}]のリクエスト[{0}]、指定されたステータスのexpiration ヘッダーの生成をスキップします。
+expiresFilter.startingPointInvalid=ディレクティブ[{1}]の無効な開始点(access|now|modification|a<seconds>|m<seconds>)[{0}]
+expiresFilter.startingPointNotFound=ディレクティブ[{0}]に開始点(access|now|modification|a<seconds>|m<seconds>)が見つかりません
+expiresFilter.unknownParameterIgnored=値[{1}]を持つ未知のパラメータ[{0}]は無視されます!
+expiresFilter.unsupportedStartingPoint=[{0}] は未対応の開始点です。
+expiresFilter.useDefaultConfiguration=コンテンツタイプ[{1}]にデフォルト[{0}]を使用すると[{2}]が返されます。
+expiresFilter.useMatchingConfiguration=content-type[{2}]が[{3}]を返すため、[{1}]と一致する[{0}]を使用します
+
+filterbase.noSuchProperty=[{1}]タイプのフィルタにはプロパティ[{0}]が定義されていません。
+
+http.403=指定されたリソース [{0}] へのアクセスは拒否されました。
+
+httpHeaderSecurityFilter.clickjack.invalid=アンチクリックジャッキングヘッダーに不正な値 [{0}] が指定されました。
+httpHeaderSecurityFilter.committed=HTTPヘッダーセキュリティフィルターへの入力時に既に応答がコミットされているため、HTTPヘッダーを追加できません。
+
+remoteCidrFilter.invalid=[{0}] に不正な値が指定されました。詳細は直前のメッセージを参照してください。
+remoteCidrFilter.noRemoteIp=クライアントは IP アドレスを持っていません。リクエストを拒否します。
+
+remoteIpFilter.invalidNumber=パラメータ[{0}]: [{1}]に不正な番号があります。
+
+requestFilter.deny=プロパティ [{1}] に従い  [{0}] へのリクエストを拒否しました。
+
+restCsrfPreventionFilter.invalidNonce=CSRF nonce の検証に失敗しました。
+
+webDavFilter.xpProblem=WebdavFixFilter:XP-x64-SP2クライアントはWebDAVサーブレットで動作しないことが知られています
+webDavFilter.xpRootContext=WebdavFixFilter:XP-x64-SP2クライアントはルートコンテキストでのみ動作します
diff --git a/java/org/apache/catalina/filters/LocalStrings_fr.properties b/java/org/apache/catalina/filters/LocalStrings_ru.properties
similarity index 71%
copy from java/org/apache/catalina/filters/LocalStrings_fr.properties
copy to java/org/apache/catalina/filters/LocalStrings_ru.properties
index 0bfcd68..07bc422 100644
--- a/java/org/apache/catalina/filters/LocalStrings_fr.properties
+++ b/java/org/apache/catalina/filters/LocalStrings_ru.properties
@@ -13,4 +13,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-http.403=L''accès à la ressource demandée ({0}) a été interdit.
+corsFilter.invalidPreflightMaxAge=Невозможно обработать значение preflightMaxAge
+
+csrfPrevention.invalidRandomClass=Невозможно создать Случайный источник с помощью [{0}]
+
+http.403=Доступ к ресурсу [{0}] был запрещён.
diff --git a/java/org/apache/catalina/filters/RemoteIpFilter.java b/java/org/apache/catalina/filters/RemoteIpFilter.java
index 2830ac7..b399854 100644
--- a/java/org/apache/catalina/filters/RemoteIpFilter.java
+++ b/java/org/apache/catalina/filters/RemoteIpFilter.java
@@ -46,6 +46,7 @@ import org.apache.catalina.AccessLog;
 import org.apache.catalina.Globals;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.res.StringManager;
 
 /**
  * <p>
@@ -656,7 +657,8 @@ public class RemoteIpFilter implements Filter {
 
     // Log must be non-static as loggers are created per class-loader and this
     // Filter may be used in multiple class loaders
-    private final Log log = LogFactory.getLog(RemoteIpFilter.class); // must not be static
+    private final Log log = LogFactory.getLog(RemoteIpFilter.class);
+    protected static final StringManager sm = StringManager.getManager(RemoteIpFilter.class);
 
     protected static final String PROTOCOL_HEADER_PARAMETER = "protocolHeader";
 
@@ -1014,7 +1016,7 @@ public class RemoteIpFilter implements Filter {
             try {
                 setHttpServerPort(Integer.parseInt(filterConfig.getInitParameter(HTTP_SERVER_PORT_PARAMETER)));
             } catch (NumberFormatException e) {
-                throw new NumberFormatException("Illegal " + HTTP_SERVER_PORT_PARAMETER + " : " + e.getMessage());
+                throw new NumberFormatException(sm.getString("remoteIpFilter.invalidNumber", HTTP_SERVER_PORT_PARAMETER, e.getLocalizedMessage()));
             }
         }
 
@@ -1022,7 +1024,7 @@ public class RemoteIpFilter implements Filter {
             try {
                 setHttpsServerPort(Integer.parseInt(filterConfig.getInitParameter(HTTPS_SERVER_PORT_PARAMETER)));
             } catch (NumberFormatException e) {
-                throw new NumberFormatException("Illegal " + HTTPS_SERVER_PORT_PARAMETER + " : " + e.getMessage());
+                throw new NumberFormatException(sm.getString("remoteIpFilter.invalidNumber", HTTPS_SERVER_PORT_PARAMETER, e.getLocalizedMessage()));
             }
         }
     }
diff --git a/java/org/apache/catalina/filters/WebdavFixFilter.java b/java/org/apache/catalina/filters/WebdavFixFilter.java
index 93608b8..ce9630d 100644
--- a/java/org/apache/catalina/filters/WebdavFixFilter.java
+++ b/java/org/apache/catalina/filters/WebdavFixFilter.java
@@ -27,6 +27,8 @@ import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.tomcat.util.res.StringManager;
+
 /**
  * Filter that attempts to force MS WebDAV clients connecting on port 80 to use
  * a WebDAV client that actually works. Other workarounds that might help
@@ -59,8 +61,7 @@ import javax.servlet.http.HttpServletResponse;
  */
 public class WebdavFixFilter implements Filter {
 
-    private static final String LOG_MESSAGE_PREAMBLE =
-        "WebdavFixFilter: Detected client problem: ";
+    protected static final StringManager sm = StringManager.getManager(WebdavFixFilter.class);
 
     /* Start string for all versions */
     private static final String UA_MINIDIR_START =
@@ -110,12 +111,11 @@ public class WebdavFixFilter implements Filter {
         } else if (ua.startsWith(UA_MINIDIR_5_2_3790)) {
             // XP 64-bit SP2
             if (!"".equals(httpRequest.getContextPath())) {
-                log(request,
-                        "XP-x64-SP2 clients only work with the root context");
+                request.getServletContext().log(sm.getString("webDavFilter.xpRootContext"));
             }
             // Namespace issue maybe
             // see http://greenbytes.de/tech/webdav/webdav-redirector-list.html
-            log(request, "XP-x64-SP2 is known not to work with WebDAV Servlet");
+            request.getServletContext().log(sm.getString("webDavFilter.xpProblem"));
 
             chain.doFilter(request, response);
         } else {
@@ -141,9 +141,4 @@ public class WebdavFixFilter implements Filter {
         return location.toString();
     }
 
-    private void log(ServletRequest request, String msg) {
-        StringBuilder builder = new StringBuilder(LOG_MESSAGE_PREAMBLE);
-        builder.append(msg);
-        request.getServletContext().log(builder.toString());
-    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


[tomcat] 01/04: Align with 8.5.x. Javadoc

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch 7.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git

commit 86ee8fc7325c4d45deed688ff47f87111d33c34d
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Tue Jul 30 15:02:54 2019 +0100

    Align with 8.5.x. Javadoc
---
 .../org/apache/catalina/filters/ExpiresFilter.java | 67 ++++++++++++++--------
 1 file changed, 44 insertions(+), 23 deletions(-)

diff --git a/java/org/apache/catalina/filters/ExpiresFilter.java b/java/org/apache/catalina/filters/ExpiresFilter.java
index dc2c39b..983fabb 100644
--- a/java/org/apache/catalina/filters/ExpiresFilter.java
+++ b/java/org/apache/catalina/filters/ExpiresFilter.java
@@ -217,27 +217,28 @@ import org.apache.juli.logging.LogFactory;
  * {@code
  * <init-param>
  *    <param-name>ExpiresDefault</param-name>
- *    <param-value><base> [plus] {<num> <type>}*</param-value>
+ *    <param-value><base> [plus] (<num> <type>)*</param-value>
  * </init-param>
  *
  * <init-param>
  *    <param-name>ExpiresByType type/encoding</param-name>
- *    <param-value><base> [plus] {<num> <type>}*</param-value>
+ *    <param-value><base> [plus] (<num> <type>)*</param-value>
  * </init-param>
  * }
  * </pre>
  * <p>
  * where {@code <base>} is one of:
+ * </p>
  * <ul>
  * <li>{@code access}</li>
  * <li>{@code now} (equivalent to &#x27;{@code access}&#x27;)</li>
  * <li>{@code modification}</li>
  * </ul>
- * </p>
  * <p>
  * The {@code plus} keyword is optional. {@code <num>} should be an
  * integer value (acceptable to {@code Integer.parseInt()}), and
  * {@code <type>} is one of:
+ * </p>
  * <ul>
  * <li>{@code years}</li>
  * <li>{@code months}</li>
@@ -247,6 +248,7 @@ import org.apache.juli.logging.LogFactory;
  * <li>{@code minutes}</li>
  * <li>{@code seconds}</li>
  * </ul>
+ * <p>
  * For example, any of the following directives can be used to make documents
  * expire 1 month after being accessed, by default:
  * </p>
@@ -296,6 +298,7 @@ import org.apache.juli.logging.LogFactory;
  * <h1>Expiration headers generation eligibility</h1>
  * <p>
  * A response is eligible to be enriched by {@code ExpiresFilter} if :
+ * </p>
  * <ol>
  * <li>no expiration header is defined ({@code Expires} header or the
  * {@code max-age} directive of the {@code Cache-Control} header),</li>
@@ -305,18 +308,18 @@ import org.apache.juli.logging.LogFactory;
  * defined the in {@code ExpiresByType} directives or the
  * {@code ExpiresDefault} directive is defined.</li>
  * </ol>
- * </p>
  * <p>
  * Note :
+ * </p>
  * <ul>
  * <li>If {@code Cache-Control} header contains other directives than
  * {@code max-age}, they are concatenated with the {@code max-age} directive
  * that is added by the {@code ExpiresFilter}.</li>
  * </ul>
- * </p>
  * <h1>Expiration configuration selection</h1>
  * <p>
  * The expiration configuration if elected according to the following algorithm:
+ * </p>
  * <ol>
  * <li>{@code ExpiresByType} matching the exact content-type returned by
  * {@code HttpServletResponse.getContentType()} possibly including the charset
@@ -330,7 +333,6 @@ import org.apache.juli.logging.LogFactory;
  * &#x27;),</li>
  * <li>{@code ExpiresDefault}</li>
  * </ol>
- * </p>
  * <h1>Implementation Details</h1><h2>When to write the expiration headers ?</h2>
  * <p>
  * The {@code ExpiresFilter} traps the &#x27;on before write response
@@ -370,6 +372,7 @@ import org.apache.juli.logging.LogFactory;
  * </p>
  * <p>
  * Key methods to override for extension are :
+ * </p>
  * <ul>
  * <li>
  * {@link #isEligibleToExpirationHeaderGeneration(HttpServletRequest, XHttpServletResponse)}
@@ -377,7 +380,6 @@ import org.apache.juli.logging.LogFactory;
  * <li>
  * {@link #getExpirationDate(XHttpServletResponse)}</li>
  * </ul>
- * </p>
  * <h1>Troubleshooting</h1>
  * <p>
  * To troubleshoot, enable logging on the
@@ -387,14 +389,14 @@ import org.apache.juli.logging.LogFactory;
  * Extract of logging.properties
  * </p>
  *
- * <code><pre>
+ * <code>
  * org.apache.catalina.filters.ExpiresFilter.level = FINE
- * </pre></code>
+ * </code>
  * <p>
  * Sample of initialization log message :
  * </p>
  *
- * <code><pre>
+ * <code>
  * Mar 26, 2010 2:01:41 PM org.apache.catalina.filters.ExpiresFilter init
  * FINE: Filter initialized with configuration ExpiresFilter[
  *    excludedResponseStatusCode=[304],
@@ -403,26 +405,25 @@ import org.apache.juli.logging.LogFactory;
  *       image=ExpiresConfiguration[startingPoint=ACCESS_TIME, duration=[10 MINUTE]],
  *       text/css=ExpiresConfiguration[startingPoint=ACCESS_TIME, duration=[10 MINUTE]],
  *       application/javascript=ExpiresConfiguration[startingPoint=ACCESS_TIME, duration=[10 MINUTE]]}]
- * </pre></code>
+ * </code>
  * <p>
  * Sample of per-request log message where {@code ExpiresFilter} adds an
  * expiration date
  * </p>
  *
- * <code><pre>
+ * <code>
  * Mar 26, 2010 2:09:47 PM org.apache.catalina.filters.ExpiresFilter onBeforeWriteResponseBody
  * FINE: Request "/tomcat.gif" with response status "200" content-type "image/gif", set expiration date 3/26/10 2:19 PM
- * </pre></code>
+ * </code>
  * <p>
  * Sample of per-request log message where {@code ExpiresFilter} does not add
  * an expiration date
  * </p>
  *
- * <code><pre>
+ * <code>
  * Mar 26, 2010 2:10:27 PM org.apache.catalina.filters.ExpiresFilter onBeforeWriteResponseBody
  * FINE: Request "/docs/config/manager.html" with response status "200" content-type "text/html", no expiration configured
- * </pre></code>
- *
+ * </code>
  */
 public class ExpiresFilter extends FilterBase {
 
@@ -1065,6 +1066,7 @@ public class ExpiresFilter extends FilterBase {
     /**
      * Convert a given comma delimited list of strings into an array of String
      *
+     * @param commaDelimitedStrings the string to be split
      * @return array of patterns (non {@code null})
      */
     protected static String[] commaDelimitedListToStringArray(
@@ -1074,8 +1076,10 @@ public class ExpiresFilter extends FilterBase {
     }
 
     /**
-     * Return {@code true} if the given {@code str} contains the given
+     * @return {@code true} if the given {@code str} contains the given
      * {@code searchStr}.
+     * @param str String that will be searched
+     * @param searchStr The substring to search
      */
     protected static boolean contains(String str, String searchStr) {
         if (str == null || searchStr == null) {
@@ -1086,6 +1090,8 @@ public class ExpiresFilter extends FilterBase {
 
     /**
      * Convert an array of ints into a comma delimited string
+     * @param ints The int array
+     * @return a comma separated string
      */
     protected static String intsToCommaDelimitedString(int[] ints) {
         if (ints == null) {
@@ -1104,7 +1110,8 @@ public class ExpiresFilter extends FilterBase {
     }
 
     /**
-     * Return {@code true} if the given {@code str} is
+     * @param str The String to check
+     * @return {@code true} if the given {@code str} is
      * {@code null} or has a zero characters length.
      */
     protected static boolean isEmpty(String str) {
@@ -1112,7 +1119,8 @@ public class ExpiresFilter extends FilterBase {
     }
 
     /**
-     * Return {@code true} if the given {@code str} has at least one
+     * @param str The String to check
+     * @return {@code true} if the given {@code str} has at least one
      * character (can be a withespace).
      */
     protected static boolean isNotEmpty(String str) {
@@ -1120,7 +1128,7 @@ public class ExpiresFilter extends FilterBase {
     }
 
     /**
-     * Return {@code true} if the given {@code string} starts with the
+     * @return {@code true} if the given {@code string} starts with the
      * given {@code prefix} ignoring case.
      *
      * @param string
@@ -1140,7 +1148,7 @@ public class ExpiresFilter extends FilterBase {
     }
 
     /**
-     * Return the subset of the given {@code str} that is before the first
+     * @return the subset of the given {@code str} that is before the first
      * occurrence of the given {@code separator}. Return {@code null}
      * if the given {@code str} or the given {@code separator} is
      * null. Return and empty string if the {@code separator} is empty.
@@ -1234,10 +1242,15 @@ public class ExpiresFilter extends FilterBase {
      * {@code protected} for extension.
      * </p>
      *
+     * @param response The Servlet response
+     * @return the expiration date
      * @see HttpServletResponse#getContentType()
      */
     protected Date getExpirationDate(XHttpServletResponse response) {
         String contentType = response.getContentType();
+        if (contentType != null) {
+            contentType = contentType.toLowerCase(Locale.ENGLISH);
+        }
 
         // lookup exact content-type match (e.g.
         // "text/html; charset=iso-8859-1")
@@ -1310,6 +1323,9 @@ public class ExpiresFilter extends FilterBase {
      * <p>
      * {@code protected} for extension.
      * </p>
+     * @param configuration The parsed expires
+     * @param response The Servlet response
+     * @return the expiration date
      */
     protected Date getExpirationDate(ExpiresConfiguration configuration,
             XHttpServletResponse response) {
@@ -1390,10 +1406,12 @@ public class ExpiresFilter extends FilterBase {
     }
 
     /**
-     *
      * <p>
      * {@code protected} for extension.
      * </p>
+     * @param request The Servlet request
+     * @param response The Servlet response
+     * @return <code>true</code> if an expire header may be added
      */
     protected boolean isEligibleToExpirationHeaderGeneration(
             HttpServletRequest request, XHttpServletResponse response) {
@@ -1442,6 +1460,8 @@ public class ExpiresFilter extends FilterBase {
      * {@link HttpServletResponse#getContentType()} costs {@code String}
      * objects instantiations (as of Tomcat 7).
      * </p>
+     * @param request The Servlet request
+     * @param response The Servlet response
      */
     public void onBeforeWriteResponseBody(HttpServletRequest request,
             XHttpServletResponse response) {
@@ -1483,7 +1503,8 @@ public class ExpiresFilter extends FilterBase {
      * '{@code access plus 1 month 15 days 2 hours}' or
      * '{@code modification 1 day 2 hours 5 seconds}'
      *
-     * @param inputLine
+     * @param inputLine the input
+     * @return the parsed expires
      */
     protected ExpiresConfiguration parseExpiresConfiguration(String inputLine) {
         String line = inputLine.trim();


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


[tomcat] 04/04: Align with 8.5.x

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch 7.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git

commit df2cd774a6477e3f34378f4cfe1a46a2578440e8
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Tue Jul 30 15:24:21 2019 +0100

    Align with 8.5.x
---
 java/org/apache/catalina/filters/RemoteIpFilter.java | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/java/org/apache/catalina/filters/RemoteIpFilter.java b/java/org/apache/catalina/filters/RemoteIpFilter.java
index 14340c9..5e95840 100644
--- a/java/org/apache/catalina/filters/RemoteIpFilter.java
+++ b/java/org/apache/catalina/filters/RemoteIpFilter.java
@@ -17,7 +17,6 @@
 package org.apache.catalina.filters;
 
 import java.io.IOException;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
@@ -562,7 +561,7 @@ public class RemoteIpFilter implements Filter {
         }
 
         public void setHeader(String name, String value) {
-            List<String> values = Arrays.asList(value);
+            List<String> values = Collections.singletonList(value);
             Map.Entry<String, List<String>> header = getHeaderEntry(name);
             if (header == null) {
                 headers.put(name, values);


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org