[Yanel-commits] rev 22378 - public/yanel/trunk/src/core/java/org/wyona/yanel/servlet

josias at wyona.com josias at wyona.com
Fri Feb 2 09:44:07 CET 2007


Author: josias
Date: 2007-02-02 09:44:04 +0100 (Fri, 02 Feb 2007)
New Revision: 22378

Modified:
   public/yanel/trunk/src/core/java/org/wyona/yanel/servlet/YanelServlet.java
Log:
applied modified patch for bug #5084: add charset to content-type header of the response. default encoding is utf-8. if a resource does not set the encoding of the view, check the mimetype and set the charset if it looks like a text mimetype. thanks to paloma for the patch.

Modified: public/yanel/trunk/src/core/java/org/wyona/yanel/servlet/YanelServlet.java
===================================================================
--- public/yanel/trunk/src/core/java/org/wyona/yanel/servlet/YanelServlet.java	2007-02-02 00:26:40 UTC (rev 22377)
+++ public/yanel/trunk/src/core/java/org/wyona/yanel/servlet/YanelServlet.java	2007-02-02 08:44:04 UTC (rev 22378)
@@ -92,6 +92,8 @@
     private static final String METHOD_DELETE = "DELETE";
 
     private String sslPort = null;
+    
+    public static final String DEFAULT_ENCODING = "UTF-8";
 
     /**
      *
@@ -421,11 +423,22 @@
             if (!view.isResponse()) return;
             
             if (view.getEncoding() != null) {
-                response.setContentType(patchContentType(view.getMimeType() + "; charset=" + view.getEncoding(), request));
+                response.setContentType(patchMimeType(view.getMimeType(), request) + "; charset=" + view.getEncoding());
             } else if (res.getConfiguration() != null && res.getConfiguration().getEncoding() != null) {
-                response.setContentType(patchContentType(view.getMimeType() + "; charset=" + res.getConfiguration().getEncoding(), request));
+                response.setContentType(patchMimeType(view.getMimeType(), request) + "; charset=" + res.getConfiguration().getEncoding());
             } else {
-                response.setContentType(patchContentType(view.getMimeType(), request));
+                // try to guess if we have to set the default encoding
+                String mimeType = view.getMimeType();
+                if (mimeType.startsWith("text") || 
+                    mimeType.equals("application/xml") || 
+                    mimeType.equals("application/xhtml+xml") || 
+                    mimeType.equals("application/atom+xml") || 
+                    mimeType.equals("application/x-javascript")) {
+                    response.setContentType(patchMimeType(mimeType, request) + "; charset=" + DEFAULT_ENCODING);
+                } else {
+                    // probably binary mime-type, don't set encoding
+                    response.setContentType(patchMimeType(mimeType, request));
+                }
             }
 
             InputStream is = view.getInputStream();
@@ -715,7 +728,7 @@
                     sb.append("<exception xmlns=\"http://www.wyona.org/neutron/1.0\" type=\"data-not-well-formed\">");
                     sb.append("<message>Data is not well-formed: "+e.getMessage()+"</message>");
                     sb.append("</exception>");
-                    response.setContentType("application/xml");
+                    response.setContentType("application/xml; charset=" + DEFAULT_ENCODING);
                     response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
                     PrintWriter w = response.getWriter();
                     w.print(sb);
@@ -730,7 +743,7 @@
                     //sb.append("<message>" + e.getMessage() + "</message>");
                     sb.append("<message>" + e + "</message>");
                     sb.append("</exception>");
-                    response.setContentType("application/xml");
+                    response.setContentType("application/xml; charset=" + DEFAULT_ENCODING);
                     response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
                     PrintWriter w = response.getWriter();
                     w.print(sb);
@@ -774,7 +787,7 @@
             sb.append("<exception xmlns=\"http://www.wyona.org/neutron/1.0\" type=\"neutron\">");
             sb.append("<message>" + message + "</message>");
             sb.append("</exception>");
-            response.setContentType("application/xml");
+            response.setContentType("application/xml; charset=" + DEFAULT_ENCODING);
             response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
             PrintWriter w = response.getWriter();
             w.print(sb);
@@ -980,7 +993,7 @@
                 sb.append("</exception>");
 
                 log.debug("Neutron-Auth response: " + sb);
-                response.setContentType("application/xml");
+                response.setContentType("application/xml; charset=" + DEFAULT_ENCODING);
                 response.setStatus(javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED);
                 response.setHeader("WWW-Authenticate", "NEUTRON-AUTH");
                 PrintWriter w = response.getWriter();
@@ -1226,7 +1239,7 @@
                         session.setAttribute(IDENTITY_KEY, new Identity(username, null));
 
                         // TODO: send some XML content, e.g. <authentication-successful/>
-                        response.setContentType("text/plain");
+                        response.setContentType("text/plain; charset=" + DEFAULT_ENCODING);
                         response.setStatus(response.SC_OK);
 
                         PrintWriter writer = response.getWriter();
@@ -1264,7 +1277,7 @@
 
                         log.debug("Neutron-Auth response: " + sb);
 
-                        response.setContentType("application/xml");
+                        response.setContentType("application/xml; charset=" + DEFAULT_ENCODING);
                         response.setStatus(javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED);
                         response.setHeader("WWW-Authenticate", "NEUTRON-AUTH");
 
@@ -1300,7 +1313,7 @@
                     sb.append("</authentication>");
                     sb.append("</exception>");
 
-                    response.setContentType("application/xml");
+                    response.setContentType("application/xml; charset=" + DEFAULT_ENCODING);
                     response.setStatus(javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED);
                     response.setHeader("WWW-Authenticate", "NEUTRON-AUTH");
 
@@ -1328,7 +1341,7 @@
         String clientSupportedAuthScheme = request.getHeader("WWW-Authenticate");
         if (clientSupportedAuthScheme != null && clientSupportedAuthScheme.equals("Neutron-Auth")) {
             // TODO: send some XML content, e.g. <logout-successful/>
-            response.setContentType("text/plain");
+            response.setContentType("text/plain; charset=" + DEFAULT_ENCODING);
             response.setStatus(response.SC_OK);
             PrintWriter writer = response.getWriter();
             writer.print("Neutron Logout Successful!");
@@ -1338,17 +1351,18 @@
     }
 
     /**
+     * Patches the mimetype of the Content-Type response field because
      * Microsoft Internet Explorer does not understand application/xhtml+xml
      * See http://en.wikipedia.org/wiki/Criticisms_of_Internet_Explorer#XHTML
      */
-    public String patchContentType(String contentType, HttpServletRequest request) throws ServletException, IOException {
+    public String patchMimeType(String mimeType, HttpServletRequest request) throws ServletException, IOException {
         String httpAcceptMediaTypes = request.getHeader("Accept");
         log.debug("HTTP Accept Media Types: " + httpAcceptMediaTypes);
-        if (contentType != null && contentType.equals("application/xhtml+xml") && httpAcceptMediaTypes != null && httpAcceptMediaTypes.indexOf("application/xhtml+xml") < 0) {
+        if (mimeType != null && mimeType.equals("application/xhtml+xml") && httpAcceptMediaTypes != null && httpAcceptMediaTypes.indexOf("application/xhtml+xml") < 0) {
             log.info("Patch contentType with text/html because client (" + request.getHeader("User-Agent") + ") does not seem to understand application/xhtml+xml");
             return "text/html";
         }
-        return contentType;
+        return mimeType;
     }
 
     /**
@@ -1378,12 +1392,12 @@
         try {
             String yanelFormat = request.getParameter("yanel.format");
             if(yanelFormat != null && yanelFormat.equals("xml")) {
-                response.setContentType("application/xml");
+                response.setContentType("application/xml; charset=" + DEFAULT_ENCODING);
                 OutputStream out = response.getOutputStream();
                 javax.xml.transform.TransformerFactory.newInstance().newTransformer().transform(new javax.xml.transform.dom.DOMSource(doc), new javax.xml.transform.stream.StreamResult(out));
                 out.close();
             } else {
-                response.setContentType("application/xhtml+xml");
+                response.setContentType("application/xhtml+xml; charset=" + DEFAULT_ENCODING);
                 Transformer transformer = TransformerFactory.newInstance().newTransformer(new StreamSource(xsltInfoAndException));
                 transformer.transform(new javax.xml.transform.dom.DOMSource(doc), new javax.xml.transform.stream.StreamResult(response.getWriter()));
             }
@@ -1429,12 +1443,12 @@
             
             String yanelFormat = request.getParameter("yanel.format");
             if(yanelFormat != null && yanelFormat.equals("xml")) {
-                response.setContentType("application/xml; charset=UTF-8");
+                response.setContentType("application/xml; charset=" + DEFAULT_ENCODING);
                 OutputStream out = response.getOutputStream();
                 javax.xml.transform.TransformerFactory.newInstance().newTransformer().transform(new javax.xml.transform.dom.DOMSource(doc), new javax.xml.transform.stream.StreamResult(out));
                 out.close();
             } else {
-                response.setContentType("application/xhtml+xml; charset=UTF-8");
+                response.setContentType("application/xhtml+xml; charset=" + DEFAULT_ENCODING);
                 response.setStatus(javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED);            
                 Transformer transformer = TransformerFactory.newInstance().newTransformer(new StreamSource(xsltLoginScreen));            
                 transformer.transform(new javax.xml.transform.dom.DOMSource(doc), 
@@ -1475,7 +1489,7 @@
 
 
             response.setStatus(javax.servlet.http.HttpServletResponse.SC_OK);
-            response.setContentType("application/xhtml+xml");
+            response.setContentType("application/xhtml+xml; charset=" + DEFAULT_ENCODING);
             PrintWriter w = response.getWriter();
             w.print(sb);
 
@@ -1493,7 +1507,7 @@
             sb.append("</html>");
             PrintWriter w = response.getWriter();
             w.print(sb);
-            response.setContentType("application/xhtml+xml");
+            response.setContentType("application/xhtml+xml; charset=" + DEFAULT_ENCODING);
             response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
             return;
         }




More information about the Yanel-commits mailing list