markt 2005/04/04 13:26:55
Modified: catalina/src/conf web.xml
catalina/src/share/org/apache/catalina/ssi SSIServlet.java
SSIServletExternalResolver.java
webapps/tomcat-docs ssi-howto.xml
Log:
Fix bug 10385. Improve support for files that use character encodings other
than
the platform default with the SSI servlet.
Revision Changes Path
1.61 +6 -0 jakarta-tomcat-4.0/catalina/src/conf/web.xml
Index: web.xml
===================================================================
RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/conf/web.xml,v
retrieving revision 1.60
retrieving revision 1.61
diff -u -r1.60 -r1.61
--- web.xml 18 Dec 2004 11:55:37 -0000 1.60
+++ web.xml 4 Apr 2005 20:26:55 -0000 1.61
@@ -189,6 +189,12 @@
<!-- relative to the context root, instead of
-->
<!-- the server root? (0=false, 1=true) [0]
-->
<!--
-->
+ <!-- inputEncoding The encoding to assume for SSI resources if
-->
+ <!-- one is not available from the resource.
-->
+ <!-- [Platform default]
-->
+ <!--
-->
+ <!-- outputEncoding The encoding to use for the page that results
-->
+ <!-- from the SSI processing. [UTF-8]
-->
<!--
-->
<!-- IMPORTANT: To use the SSI servlet, you also need to rename the
-->
<!-- $CATALINA_HOME/server/lib/servlets-ssi.renametojar file
-->
1.6 +40 -5
jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/ssi/SSIServlet.java
Index: SSIServlet.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/ssi/SSIServlet.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- SSIServlet.java 3 Apr 2005 18:55:30 -0000 1.5
+++ SSIServlet.java 4 Apr 2005 20:26:55 -0000 1.6
@@ -54,6 +54,12 @@
/** virtual path can be webapp-relative */
protected boolean isVirtualWebappRelative = false;
+
+ /** Input encoding. If not specified, uses platform default */
+ protected String inputEncoding = null;
+
+ /** Output encoding. If not specified, uses platform default */
+ protected String outputEncoding = "UTF-8";
//----------------- Public methods.
@@ -92,6 +98,19 @@
} catch (Throwable t) {
;
}
+ try {
+ inputEncoding =
getServletConfig().getInitParameter("inputEncoding");
+ } catch (Throwable t) {
+ ;
+ }
+ try {
+ value = getServletConfig().getInitParameter("outputEncoding");
+ if (value != null) {
+ outputEncoding = value;
+ }
+ } catch (Throwable t) {
+ ;
+ }
if (debug > 0)
log("SSIServlet.init() SSI invoker started with 'debug'="
+ debug);
@@ -165,6 +184,12 @@
return;
}
+ String resourceMimeType = servletContext.getMimeType(path);
+ if (resourceMimeType == null) {
+ resourceMimeType = "text/html";
+ }
+ res.setContentType(resourceMimeType + ";charset=" + outputEncoding);
+
if (expires != null) {
res.setDateHeader("Expires", (
new java.util.Date()).getTime() + expires.longValue() *
1000);
@@ -180,8 +205,7 @@
SSIExternalResolver ssiExternalResolver =
new SSIServletExternalResolver( this, req, res,
- isVirtualWebappRelative,
- debug );
+ isVirtualWebappRelative, debug, inputEncoding);
SSIProcessor ssiProcessor =
new SSIProcessor( ssiExternalResolver, debug );
@@ -196,8 +220,19 @@
URLConnection resourceInfo = resource.openConnection();
InputStream resourceInputStream = resourceInfo.getInputStream();
- BufferedReader bufferedReader =
- new BufferedReader(new InputStreamReader(resourceInputStream));
+
+ String encoding = resourceInfo.getContentEncoding();
+ if (encoding == null) {
+ encoding = inputEncoding;
+ }
+ InputStreamReader isr;
+ if (encoding == null) {
+ isr = new InputStreamReader(resourceInputStream);
+ } else {
+ isr = new InputStreamReader(resourceInputStream, encoding);
+ }
+ BufferedReader bufferedReader = new BufferedReader(isr);
+
Date lastModifiedDate = new Date(resourceInfo.getLastModified());
ssiProcessor.process(bufferedReader, lastModifiedDate, printWriter);
1.5 +19 -10
jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/ssi/SSIServletExternalResolver.java
Index: SSIServletExternalResolver.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/ssi/SSIServletExternalResolver.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- SSIServletExternalResolver.java 30 Mar 2005 21:53:05 -0000 1.4
+++ SSIServletExternalResolver.java 4 Apr 2005 20:26:55 -0000 1.5
@@ -52,15 +52,17 @@
protected HttpServletResponse res;
protected boolean isVirtualWebappRelative;
protected int debug;
-
- public SSIServletExternalResolver( HttpServlet servlet,
HttpServletRequest req, HttpServletResponse res,
- boolean isVirtualWebappRelative,
- int debug ) {
+ protected String inputEncoding;
+
+ public SSIServletExternalResolver( HttpServlet servlet,
+ HttpServletRequest req, HttpServletResponse res,
+ boolean isVirtualWebappRelative, int debug, String
inputEncoding) {
this.servlet = servlet;
this.req = req;
this.res = res;
this.isVirtualWebappRelative = isVirtualWebappRelative;
this.debug = debug;
+ this.inputEncoding = inputEncoding;
}
public void log( String message, Throwable throwable ) {
@@ -343,9 +345,11 @@
return fileSize;
}
- //We are making lots of unnecessary copies of the included data here.
If someone ever complains that this
- //is slow, we should connect the included stream to the print writer
that SSICommand uses.
- public String getFileText( String originalPath, boolean virtual ) throws
IOException {
+ //We are making lots of unnecessary copies of the included data here. If
+ // someone ever complains that this is slow, we should connect the
included
+ // stream to the print writer that SSICommand uses.
+ public String getFileText( String originalPath, boolean virtual
+ ) throws IOException {
try {
ServletContextAndPath csAndP = getServletContextAndPath(
originalPath, virtual );
ServletContext context = csAndP.getServletContext();
@@ -365,8 +369,13 @@
responseIncludeWrapper.flushOutputStreamOrWriter();
byte[] bytes = basos.toByteArray();
- //Assume that the default encoding is what was used to encode the
bytes. Questionable.
- String retVal = new String( bytes );
+ //Assume platform default encoding unless otherwsie specified
+ String retVal;
+ if (inputEncoding == null) {
+ retVal = new String( bytes );
+ } else {
+ retVal = new String (bytes, inputEncoding);
+ }
//make an assumption that an empty response is a failure. This is
a problem if a truly empty file
//were included, but not sure how else to tell.
1.3 +5 -0 jakarta-tomcat-4.0/webapps/tomcat-docs/ssi-howto.xml
Index: ssi-howto.xml
===================================================================
RCS file: /home/cvs/jakarta-tomcat-4.0/webapps/tomcat-docs/ssi-howto.xml,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- ssi-howto.xml 12 Jan 2003 17:26:46 -0000 1.2
+++ ssi-howto.xml 4 Apr 2005 20:26:55 -0000 1.3
@@ -65,6 +65,11 @@
<li><strong>isVirtualWebappRelative</strong> - Should "virtual" SSI directive
paths be interpreted as relative to the context root, instead of the server
root? (0=false, 1=true) Default 0 (false).</li>
+<li><strong>inputEncoding</strong> - The encoding to be assumed for SSI
+resources if one cannot be determined from the resource itself. Default is
+the default platform encoding.</li>
+<li><strong>outputEncoding</strong> - The encoding to be used for the result
+of the SSI processing. Default is UTF-8.</li>
</ul>
</p>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]