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...@locus.apache.org on 2000/02/03 03:13:14 UTC
cvs commit: jakarta-tomcat/src/share/org/apache/tomcat/core ResponseImpl.java
mandar 00/02/02 18:13:14
Modified: src/share/org/apache/jasper/compiler Compiler.java
src/share/org/apache/tomcat/core ResponseImpl.java
Log:
1) To support multiple encodings (and not just the default),
we scan the JSP file for a contentType directive. If one
is found then we initialize the JspReader with the
encoding present in the directive.
This is inefficient as it needs a two-pass parser, but
solves the bigger problem of multiple encodings (Japanese
and others).
2) While fixing this problem, I noticed that the "Content-Type"
, "Content-Length" and "Content-Language" HTTP headers
were not set.
Revision Changes Path
1.9 +59 -3 jakarta-tomcat/src/share/org/apache/jasper/compiler/Compiler.java
Index: Compiler.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/jasper/compiler/Compiler.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- Compiler.java 2000/01/24 05:54:50 1.8
+++ Compiler.java 2000/02/03 02:13:12 1.9
@@ -1,7 +1,7 @@
/*
- * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/jasper/compiler/Compiler.java,v 1.8 2000/01/24 05:54:50 shemnon Exp $
- * $Revision: 1.8 $
- * $Date: 2000/01/24 05:54:50 $
+ * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/jasper/compiler/Compiler.java,v 1.9 2000/02/03 02:13:12 mandar Exp $
+ * $Revision: 1.9 $
+ * $Date: 2000/02/03 02:13:12 $
*
* ====================================================================
*
@@ -60,6 +60,7 @@
*/
package org.apache.jasper.compiler;
+import java.util.Hashtable;
import java.io.FileNotFoundException;
import java.io.File;
import java.io.PrintWriter;
@@ -69,6 +70,7 @@
import org.apache.jasper.JspCompilationContext;
import org.apache.jasper.Constants;
import org.apache.jasper.JasperException;
+import org.apache.jasper.compiler.ParseException;
/**
* If you want to customize JSP compilation aspects, this class is
@@ -79,6 +81,7 @@
* change.
*
* @author Anil K. Vijendran
+ * @author Mandar Raje
*/
public abstract class Compiler {
protected JavaCompiler javac;
@@ -132,6 +135,21 @@
String jspEncoding = "8859_1"; // default per JSP spec
String javaEncoding = "UTF8"; // perhaps debatable?
+ // This seems to be a reasonable point to scan the JSP file
+ // for a 'contentType' directive. If it found then the set
+ // the value of 'jspEncoding to reflect the value specified.
+ // Note: if (true) is convenience programming. It can be
+ // taken out once we have a more efficient method.
+
+ if (true) {
+ JspReader tmpReader = JspReader.createJspReader(
+ ctxt.getJspFile(),
+ ctxt,
+ jspEncoding);
+ String newEncode = changeEncodingIfNecessary(tmpReader);
+ if (newEncode != null) jspEncoding = newEncode;
+ }
+
JspReader reader = JspReader.createJspReader(
ctxt.getJspFile(),
ctxt,
@@ -256,4 +274,42 @@
public void setMangler(Mangler mangler) {
this.mangler = mangler;
}
+
+ /**
+ * Change the encoding for the reader if specified.
+ */
+ public String changeEncodingIfNecessary(JspReader tmpReader) {
+
+ // A lot of code replicated from Parser.java
+ // Main aim is to "get-it-to-work".
+ while (tmpReader.skipUntil("<%@") != null) {
+
+ tmpReader.skipSpaces();
+
+ // check if it is a page directive.
+ if (tmpReader.matches("page")) {
+
+ tmpReader.advance(4);
+ tmpReader.skipSpaces();
+
+ try {
+ Hashtable attrs = tmpReader.parseTagAttributes();
+ String ct = (String) attrs.get("contentType");
+ if (ct != null) {
+ int loc = ct.indexOf("charset=");
+ if (loc > 0) {
+ String encoding = ct.substring(loc + 8);
+ return encoding;
+ }
+ }
+ } catch (ParseException ex) {
+ // Ignore the exception here, it will be caught later.
+ return null;
+ }
+ }
+ }
+ return null;
+ }
}
+
+
1.12 +7 -3 jakarta-tomcat/src/share/org/apache/tomcat/core/ResponseImpl.java
Index: ResponseImpl.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/ResponseImpl.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- ResponseImpl.java 2000/02/01 21:39:39 1.11
+++ ResponseImpl.java 2000/02/03 02:13:13 1.12
@@ -1,7 +1,7 @@
/*
- * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/ResponseImpl.java,v 1.11 2000/02/01 21:39:39 costin Exp $
- * $Revision: 1.11 $
- * $Date: 2000/02/01 21:39:39 $
+ * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/ResponseImpl.java,v 1.12 2000/02/03 02:13:13 mandar Exp $
+ * $Revision: 1.12 $
+ * $Date: 2000/02/03 02:13:13 $
*
* ====================================================================
*
@@ -327,6 +327,8 @@
// Use the setContentType() method so encoding is set properly
String newType = constructLocalizedContentType(contentType, locale);
setContentType(newType);
+
+ addHeader("Content-Language", contentLanguage);
}
/** Utility method for parsing the mime type and setting
@@ -358,6 +360,7 @@
if (encoding != null) {
characterEncoding = encoding;
}
+ addHeader("Content-Type", contentType);
}
public String getContentType() {
@@ -366,6 +369,7 @@
public void setContentLength(int contentLength) {
this.contentLength = contentLength;
+ addHeader("Content-Length", (new Integer(contentLength)).toString());
}
public int getContentLength() {