Author: musachy
Date: Mon Nov  2 22:23:28 2009
New Revision: 832148

URL: http://svn.apache.org/viewvc?rev=832148&view=rev
Log:
WW-3305 FreemarkerResult tamper Content-Type

patch provided by zhouyanming

Added:
    
struts/struts2/trunk/core/src/test/resources/org/apache/struts2/views/freemarker/something.ftl
Modified:
    
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/freemarker/FreemarkerResult.java
    
struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/freemarker/FreeMarkerResultTest.java

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/freemarker/FreemarkerResult.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/freemarker/FreemarkerResult.java?rev=832148&r1=832147&r2=832148&view=diff
==============================================================================
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/freemarker/FreemarkerResult.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/freemarker/FreemarkerResult.java
 Mon Nov  2 22:23:28 2009
@@ -311,22 +311,25 @@
     protected boolean preTemplateProcess(Template template, TemplateModel 
model) throws IOException {
         Object attrContentType = template.getCustomAttribute("content_type");
 
-        if (attrContentType != null) {
-            
ServletActionContext.getResponse().setContentType(attrContentType.toString());
-        } else {
-            String contentType = getContentType();
+        HttpServletResponse response = ServletActionContext.getResponse();
+        if (response.getContentType() == null) {
+            if (attrContentType != null) {
+                response.setContentType(attrContentType.toString());
+            } else {
+                String contentType = getContentType();
+
+                if (contentType == null) {
+                    contentType = "text/html";
+                }
+
+                String encoding = template.getEncoding();
+
+                if (encoding != null) {
+                    contentType = contentType + "; charset=" + encoding;
+                }
 
-            if (contentType == null) {
-                contentType = "text/html";
+                response.setContentType(contentType);
             }
-
-            String encoding = template.getEncoding();
-
-            if (encoding != null) {
-                contentType = contentType + "; charset=" + encoding;
-            }
-
-            ServletActionContext.getResponse().setContentType(contentType);
         }
 
         return true;

Modified: 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/freemarker/FreeMarkerResultTest.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/freemarker/FreeMarkerResultTest.java?rev=832148&r1=832147&r2=832148&view=diff
==============================================================================
--- 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/freemarker/FreeMarkerResultTest.java
 (original)
+++ 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/freemarker/FreeMarkerResultTest.java
 Mon Nov  2 22:23:28 2009
@@ -145,6 +145,45 @@
         }
     }
 
+    public void testContentTypeIsNotOverwritten() throws Exception {
+         servletContext.setRealPath(new 
File(FreeMarkerResultTest.class.getResource(
+                                       
"nested.ftl").toURI()).toURL().getFile());
+
+        FreemarkerResult result = new FreemarkerResult();
+        result.setLocation("nested.ftl");
+        result.setFreemarkerManager(mgr);
+                                   
+        response.setContentType("contenttype"); 
+        result.execute(invocation);
+        assertEquals("contenttype", response.getContentType());
+    }
+
+    public void testDefaultContentType() throws Exception {
+         servletContext.setRealPath(new 
File(FreeMarkerResultTest.class.getResource(
+                                       
"nested.ftl").toURI()).toURL().getFile());
+
+        FreemarkerResult result = new FreemarkerResult();
+        result.setLocation("nested.ftl");
+        result.setFreemarkerManager(mgr);
+
+        assertNull(response.getContentType());
+        result.execute(invocation);
+        assertEquals("text/html; charset=UTF-8", response.getContentType());
+    }
+
+    public void testContentTypeFromTemplate() throws Exception {
+         servletContext.setRealPath(new 
File(FreeMarkerResultTest.class.getResource(
+                                       
"something.ftl").toURI()).toURL().getFile());
+
+        FreemarkerResult result = new FreemarkerResult();
+        result.setLocation("something.ftl");
+        result.setFreemarkerManager(mgr);
+
+        assertNull(response.getContentType());
+        result.execute(invocation);
+        assertEquals("text/xml", response.getContentType());
+    }
+
     protected void setUp() throws Exception {
         super.setUp();
         mgr = new FreemarkerManager();

Added: 
struts/struts2/trunk/core/src/test/resources/org/apache/struts2/views/freemarker/something.ftl
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/resources/org/apache/struts2/views/freemarker/something.ftl?rev=832148&view=auto
==============================================================================
--- 
struts/struts2/trunk/core/src/test/resources/org/apache/struts2/views/freemarker/something.ftl
 (added)
+++ 
struts/struts2/trunk/core/src/test/resources/org/apache/struts2/views/freemarker/something.ftl
 Mon Nov  2 22:23:28 2009
@@ -0,0 +1,24 @@
+<#ftl attributes={"content_type": "text/xml"} />
+<#--
+/*
+ * $Id: someFreeMarkerFile.ftl 590812 2007-10-31 20:32:54Z apetrelli $
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+-->
+test


Reply via email to