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

rmaucher pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git

commit c8f4c0dc8da01d54cb01c5451ddb68de71089383
Author: opencode <[email protected]>
AuthorDate: Fri Oct 16 11:55:30 2026 +0200

    Harmonize resource bundle processing in ProxyErrorReportValve
    
    The redirect url lookup of ProxyErrorReportValve passed the response
    locale straight to ResourceBundle.getBundle(). The StringManager locale
    processing introduced by commit c45c9b47f3 handles this differently: a
    bundle is only loaded for a locale for which a bundle actually exists,
    checked with a cache free probe.
    
    Align the valve with that processing. Resolve the response locale
    through the candidate locales of the default control, check each
    candidate with StringManager.bundleExists() and only then load the
    bundle for the first matching candidate. Locales that match no
    candidate fall back to the default error report as before. To allow the
    reuse, make bundleExists() in StringManager accessible outside the
    class. For the documented layout, a properties file at the root of the
    class path, the resolution is unchanged for every locale.
---
 .../catalina/valves/ProxyErrorReportValve.java     | 23 +++++++++++++++++++++-
 java/org/apache/tomcat/util/res/StringManager.java |  2 +-
 2 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/java/org/apache/catalina/valves/ProxyErrorReportValve.java 
b/java/org/apache/catalina/valves/ProxyErrorReportValve.java
index 14b891834a..ed40596203 100644
--- a/java/org/apache/catalina/valves/ProxyErrorReportValve.java
+++ b/java/org/apache/catalina/valves/ProxyErrorReportValve.java
@@ -25,6 +25,7 @@ import java.net.URISyntaxException;
 import java.net.URL;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
+import java.util.Locale;
 import java.util.MissingResourceException;
 import java.util.ResourceBundle;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -57,6 +58,13 @@ public class ProxyErrorReportValve extends ErrorReportValve {
     private static final int PROXY_CONNECT_TIMEOUT_MS = 5000;
     private static final int PROXY_READ_TIMEOUT_MS = 10000;
 
+    /*
+     * Control used to resolve the candidate locales of the optional 
properties file bundle. The default control is the
+     * one getBundle() uses, so the candidate chain matches the one 
getBundle() would walk.
+     */
+    private static final ResourceBundle.Control BUNDLE_CONTROL =
+            
ResourceBundle.Control.getControl(ResourceBundle.Control.FORMAT_PROPERTIES);
+
     /**
      * Default constructor.
      */
@@ -111,9 +119,22 @@ public class ProxyErrorReportValve extends 
ErrorReportValve {
     }
 
     private String getRedirectUrl(Response response) {
+        String bundleName = this.getClass().getSimpleName();
+        // Resolve the bundle for the first candidate locale for which a 
bundle exists.
+        Locale bundleLocale = null;
+        for (Locale candidate : BUNDLE_CONTROL.getCandidateLocales(bundleName, 
response.getLocale())) {
+            if (StringManager.bundleExists(bundleName, candidate)) {
+                bundleLocale = candidate;
+                break;
+            }
+        }
+        if (bundleLocale == null) {
+            // No bundle available. Fall back to the default error report.
+            return null;
+        }
         ResourceBundle resourceBundle;
         try {
-            resourceBundle = 
ResourceBundle.getBundle(this.getClass().getSimpleName(), response.getLocale());
+            resourceBundle = ResourceBundle.getBundle(bundleName, 
bundleLocale);
         } catch (MissingResourceException e) {
             // No bundle available. Fall back to the default error report.
             return null;
diff --git a/java/org/apache/tomcat/util/res/StringManager.java 
b/java/org/apache/tomcat/util/res/StringManager.java
index 7724748ee2..e5a7ee52f6 100644
--- a/java/org/apache/tomcat/util/res/StringManager.java
+++ b/java/org/apache/tomcat/util/res/StringManager.java
@@ -302,7 +302,7 @@ public class StringManager {
      *
      * @return true if a bundle exists for the given locale
      */
-    private static boolean bundleExists(String bundleName, Locale locale) {
+    public static boolean bundleExists(String bundleName, Locale locale) {
         ClassLoader classLoader = StringManager.class.getClassLoader();
         if (bundleExists(bundleName, locale, classLoader)) {
             return true;


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to