Author: markt Date: Thu Aug 15 21:11:58 2013 New Revision: 1514496 URL: http://svn.apache.org/r1514496 Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=55399 Have the message in the response line use the locale set for the response.
Modified: tomcat/tc7.0.x/trunk/ (props changed) tomcat/tc7.0.x/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java tomcat/tc7.0.x/trunk/java/org/apache/catalina/manager/ManagerServlet.java tomcat/tc7.0.x/trunk/java/org/apache/catalina/manager/host/HTMLHostManagerServlet.java tomcat/tc7.0.x/trunk/java/org/apache/catalina/manager/host/HostManagerServlet.java tomcat/tc7.0.x/trunk/java/org/apache/catalina/valves/ErrorReportValve.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/AbstractOutputBuffer.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/InternalAprOutputBuffer.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/InternalNioOutputBuffer.java tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/HttpMessages.java tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/res/StringManager.java tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Propchange: tomcat/tc7.0.x/trunk/ ------------------------------------------------------------------------------ Merged /tomcat/trunk:r1514291,1514305,1514485-1514486 Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java?rev=1514496&r1=1514495&r2=1514496&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java Thu Aug 15 21:11:58 2013 @@ -116,7 +116,8 @@ public final class HTMLManagerServlet ex HttpServletResponse response) throws IOException, ServletException { - StringManager smClient = getStringManager(request); + StringManager smClient = StringManager.getManager( + Constants.Package, request.getLocales()); // Identify the request parameters that we need // By obtaining the command from the pathInfo, per-command security can @@ -175,7 +176,8 @@ public final class HTMLManagerServlet ex HttpServletResponse response) throws IOException, ServletException { - StringManager smClient = getStringManager(request); + StringManager smClient = StringManager.getManager( + Constants.Package, request.getLocales()); // Identify the request parameters that we need // By obtaining the command from the pathInfo, per-command security can Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/manager/ManagerServlet.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/manager/ManagerServlet.java?rev=1514496&r1=1514495&r2=1514496&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/manager/ManagerServlet.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/manager/ManagerServlet.java Thu Aug 15 21:11:58 2013 @@ -319,7 +319,8 @@ public class ManagerServlet extends Http HttpServletResponse response) throws IOException, ServletException { - StringManager smClient = getStringManager(request); + StringManager smClient = StringManager.getManager( + Constants.Package, request.getLocales()); // Identify the request parameters that we need String command = request.getPathInfo(); @@ -406,7 +407,8 @@ public class ManagerServlet extends Http HttpServletResponse response) throws IOException, ServletException { - StringManager smClient = getStringManager(request); + StringManager smClient = StringManager.getManager( + Constants.Package, request.getLocales()); // Identify the request parameters that we need String command = request.getPathInfo(); @@ -1575,6 +1577,11 @@ public class ManagerServlet extends Http } + /** + * @deprecated Use {@link StringManager#getManager(String, Enumeration)}. + * This method will be removed in Tomcat 8. + */ + @Deprecated protected StringManager getStringManager(HttpServletRequest req) { Enumeration<Locale> requestedLocales = req.getLocales(); while (requestedLocales.hasMoreElements()) { Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/manager/host/HTMLHostManagerServlet.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/manager/host/HTMLHostManagerServlet.java?rev=1514496&r1=1514495&r2=1514496&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/manager/host/HTMLHostManagerServlet.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/manager/host/HTMLHostManagerServlet.java Thu Aug 15 21:11:58 2013 @@ -80,7 +80,8 @@ public final class HTMLHostManagerServle HttpServletResponse response) throws IOException, ServletException { - StringManager smClient = getStringManager(request); + StringManager smClient = StringManager.getManager( + Constants.Package, request.getLocales()); // Identify the request parameters that we need String command = request.getPathInfo(); @@ -120,7 +121,8 @@ public final class HTMLHostManagerServle public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - StringManager smClient = getStringManager(request); + StringManager smClient = StringManager.getManager( + Constants.Package, request.getLocales()); // Identify the request parameters that we need String command = request.getPathInfo(); Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/manager/host/HostManagerServlet.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/manager/host/HostManagerServlet.java?rev=1514496&r1=1514495&r2=1514496&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/manager/host/HostManagerServlet.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/manager/host/HostManagerServlet.java Thu Aug 15 21:11:58 2013 @@ -212,7 +212,8 @@ public class HostManagerServlet HttpServletResponse response) throws IOException, ServletException { - StringManager smClient = getStringManager(request); + StringManager smClient = StringManager.getManager( + Constants.Package, request.getLocales()); // Identify the request parameters that we need String command = request.getPathInfo(); @@ -709,6 +710,11 @@ public class HostManagerServlet } + /** + * @deprecated Use {@link StringManager#getManager(String, Enumeration)}. + * This method will be removed in Tomcat 8. + */ + @Deprecated protected StringManager getStringManager(HttpServletRequest req) { Enumeration<Locale> requestedLocales = req.getLocales(); while (requestedLocales.hasMoreElements()) { Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/valves/ErrorReportValve.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/valves/ErrorReportValve.java?rev=1514496&r1=1514495&r2=1514496&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/valves/ErrorReportValve.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/valves/ErrorReportValve.java Thu Aug 15 21:11:58 2013 @@ -30,6 +30,7 @@ import org.apache.catalina.connector.Res import org.apache.catalina.util.RequestUtil; import org.apache.catalina.util.ServerInfo; import org.apache.tomcat.util.ExceptionUtils; +import org.apache.tomcat.util.res.StringManager; /** * <p>Implementation of a Valve that outputs HTML error pages.</p> @@ -182,8 +183,11 @@ public class ErrorReportValve extends Va // Do nothing if there is no report for the specified status code and // no error message provided String report = null; + StringManager smClient = StringManager.getManager( + Constants.Package, request.getLocales()); + response.setLocale(smClient.getLocale()); try { - report = sm.getString("http." + statusCode); + report = smClient.getString("http." + statusCode); } catch (Throwable t) { ExceptionUtils.handleThrowable(t); } @@ -191,7 +195,7 @@ public class ErrorReportValve extends Va if (message.length() == 0) { return; } else { - report = sm.getString("errorReportValve.noDescription"); + report = smClient.getString("errorReportValve.noDescription"); } } @@ -199,29 +203,29 @@ public class ErrorReportValve extends Va sb.append("<html><head><title>"); sb.append(ServerInfo.getServerInfo()).append(" - "); - sb.append(sm.getString("errorReportValve.errorReport")); + sb.append(smClient.getString("errorReportValve.errorReport")); sb.append("</title>"); sb.append("<style><!--"); sb.append(org.apache.catalina.util.TomcatCSS.TOMCAT_CSS); sb.append("--></style> "); sb.append("</head><body>"); sb.append("<h1>"); - sb.append(sm.getString("errorReportValve.statusHeader", + sb.append(smClient.getString("errorReportValve.statusHeader", "" + statusCode, message)).append("</h1>"); sb.append("<HR size=\"1\" noshade=\"noshade\">"); sb.append("<p><b>type</b> "); if (throwable != null) { - sb.append(sm.getString("errorReportValve.exceptionReport")); + sb.append(smClient.getString("errorReportValve.exceptionReport")); } else { - sb.append(sm.getString("errorReportValve.statusReport")); + sb.append(smClient.getString("errorReportValve.statusReport")); } sb.append("</p>"); sb.append("<p><b>"); - sb.append(sm.getString("errorReportValve.message")); + sb.append(smClient.getString("errorReportValve.message")); sb.append("</b> <u>"); sb.append(message).append("</u></p>"); sb.append("<p><b>"); - sb.append(sm.getString("errorReportValve.description")); + sb.append(smClient.getString("errorReportValve.description")); sb.append("</b> <u>"); sb.append(report); sb.append("</u></p>"); @@ -230,7 +234,7 @@ public class ErrorReportValve extends Va String stackTrace = getPartialServletStackTrace(throwable); sb.append("<p><b>"); - sb.append(sm.getString("errorReportValve.exception")); + sb.append(smClient.getString("errorReportValve.exception")); sb.append("</b> <pre>"); sb.append(RequestUtil.filter(stackTrace)); sb.append("</pre></p>"); @@ -240,7 +244,7 @@ public class ErrorReportValve extends Va while (rootCause != null && (loops < 10)) { stackTrace = getPartialServletStackTrace(rootCause); sb.append("<p><b>"); - sb.append(sm.getString("errorReportValve.rootCause")); + sb.append(smClient.getString("errorReportValve.rootCause")); sb.append("</b> <pre>"); sb.append(RequestUtil.filter(stackTrace)); sb.append("</pre></p>"); @@ -250,9 +254,9 @@ public class ErrorReportValve extends Va } sb.append("<p><b>"); - sb.append(sm.getString("errorReportValve.note")); + sb.append(smClient.getString("errorReportValve.note")); sb.append("</b> <u>"); - sb.append(sm.getString("errorReportValve.rootCauseInLogs", + sb.append(smClient.getString("errorReportValve.rootCauseInLogs", ServerInfo.getServerInfo())); sb.append("</u></p>"); Modified: tomcat/tc7.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java?rev=1514496&r1=1514495&r2=1514496&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java Thu Aug 15 21:11:58 2013 @@ -949,7 +949,8 @@ public abstract class AbstractAjpProcess message = response.getMessage(); } if (message == null){ - message = HttpMessages.getMessage(response.getStatus()); + message = HttpMessages.getInstance( + response.getLocale()).getMessage(response.getStatus()); } if (message == null) { // mod_jk + httpd 2.x fails with a null status message - bug 45026 Modified: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/AbstractOutputBuffer.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/AbstractOutputBuffer.java?rev=1514496&r1=1514495&r2=1514496&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/AbstractOutputBuffer.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/AbstractOutputBuffer.java Thu Aug 15 21:11:58 2013 @@ -354,7 +354,8 @@ public abstract class AbstractOutputBuff message = response.getMessage(); } if (message == null) { - write(HttpMessages.getMessage(status)); + write(HttpMessages.getInstance( + response.getLocale()).getMessage(status)); } else { write(message); } Modified: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/InternalAprOutputBuffer.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/InternalAprOutputBuffer.java?rev=1514496&r1=1514495&r2=1514496&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/InternalAprOutputBuffer.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/InternalAprOutputBuffer.java Thu Aug 15 21:11:58 2013 @@ -63,7 +63,7 @@ public class InternalAprOutputBuffer ext finished = false; // Cause loading of HttpMessages - HttpMessages.getMessage(200); + HttpMessages.getInstance(response.getLocale()).getMessage(200); } Modified: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/InternalNioOutputBuffer.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/InternalNioOutputBuffer.java?rev=1514496&r1=1514495&r2=1514496&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/InternalNioOutputBuffer.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/InternalNioOutputBuffer.java Thu Aug 15 21:11:58 2013 @@ -61,7 +61,7 @@ public class InternalNioOutputBuffer ext finished = false; // Cause loading of HttpMessages - HttpMessages.getMessage(200); + HttpMessages.getInstance(response.getLocale()).getMessage(200); } Modified: tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/HttpMessages.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/HttpMessages.java?rev=1514496&r1=1514495&r2=1514496&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/HttpMessages.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/HttpMessages.java Thu Aug 15 21:11:58 2013 @@ -16,6 +16,10 @@ */ package org.apache.tomcat.util.http; +import java.util.Locale; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + import org.apache.tomcat.util.res.StringManager; /** @@ -28,14 +32,24 @@ import org.apache.tomcat.util.res.String * @author cos...@eng.sun.com */ public class HttpMessages { + + private static final Map<Locale,HttpMessages> instances = + new ConcurrentHashMap<Locale, HttpMessages>(); + + private static final HttpMessages DEFAULT = getInstance(Locale.getDefault()); + // XXX move message resources in this package - protected static final StringManager sm = - StringManager.getManager("org.apache.tomcat.util.http.res"); + private final StringManager sm; + + private String st_200 = null; + private String st_302 = null; + private String st_400 = null; + private String st_404 = null; + + private HttpMessages(StringManager sm) { + this.sm = sm; + } - static String st_200=null; - static String st_302=null; - static String st_400=null; - static String st_404=null; /** Get the status string associated with a status code. * No I18N - return the messages defined in the HTTP spec. @@ -45,36 +59,53 @@ public class HttpMessages { * Common messages are cached. * */ - public static String getMessage( int status ) { + public String getMessage(int status) { // method from Response. // Does HTTP requires/allow international messages or // are pre-defined? The user doesn't see them most of the time switch( status ) { case 200: - if( st_200==null ) { - st_200=sm.getString( "sc.200"); + if(st_200 == null ) { + st_200 = sm.getString("sc.200"); } return st_200; case 302: - if( st_302==null ) { - st_302=sm.getString( "sc.302"); + if(st_302 == null ) { + st_302 = sm.getString("sc.302"); } return st_302; case 400: - if( st_400==null ) { - st_400=sm.getString( "sc.400"); + if(st_400 == null ) { + st_400 = sm.getString("sc.400"); } return st_400; case 404: - if( st_404==null ) { - st_404=sm.getString( "sc.404"); + if(st_404 == null ) { + st_404 = sm.getString("sc.404"); } return st_404; } return sm.getString("sc."+ status); } + + public static HttpMessages getInstance(Locale locale) { + HttpMessages result = instances.get(locale); + if (result == null) { + StringManager sm = StringManager.getManager( + "org.apache.tomcat.util.http.res", locale); + if (Locale.getDefault().equals(sm.getLocale())) { + result = DEFAULT; + } else { + result = new HttpMessages(sm); + } + instances.put(locale, result); + } + return result; + } + + /** * Filter the specified message string for characters that are sensitive * in HTML. This avoids potential attacks caused by including JavaScript Modified: tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/res/StringManager.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/res/StringManager.java?rev=1514496&r1=1514495&r2=1514496&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/res/StringManager.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/res/StringManager.java Thu Aug 15 21:11:58 2013 @@ -18,6 +18,7 @@ package org.apache.tomcat.util.res; import java.text.MessageFormat; +import java.util.Enumeration; import java.util.Hashtable; import java.util.Locale; import java.util.Map; @@ -208,4 +209,27 @@ public class StringManager { } return mgr; } + + /** + * Retrieve the StringManager for a list of Locales. The first StringManager + * found will be returned. + * + * @param requestedLocales the list of Locales + * + * @return the found StringManager or the default StringManager + */ + public static StringManager getManager(String packageName, + Enumeration<Locale> requestedLocales) { + while (requestedLocales.hasMoreElements()) { + Locale locale = requestedLocales.nextElement(); + StringManager result = getManager(packageName, locale); + if (result.getLocale().equals(locale)) { + return result; + } + } + // Return the default + return getManager(packageName); + } + + } Modified: tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml?rev=1514496&r1=1514495&r2=1514496&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml (original) +++ tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Thu Aug 15 21:11:58 2013 @@ -137,6 +137,10 @@ Ensure that <code>java.lang.VirtualMachineError</code>s are not swallowed when using the HTTP or AJP NIO connectors. (markt) </fix> + <fix> + <bug>55399</bug>: Use the response locale to select the language to use + for the status message in the HTTP response. (markt) + </fix> </changelog> </subsection> <subsection name="Jasper"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org