Author: markt
Date: Fri Oct 10 14:28:59 2014
New Revision: 1630911

URL: http://svn.apache.org/r1630911
Log:
Allow Set-Cookie headers to use UTF-8

Added:
    
tomcat/trunk/test/org/apache/tomcat/util/http/TestCookieProcessorGenerationHttp.java
   (with props)
Modified:
    tomcat/trunk/java/org/apache/catalina/connector/Response.java
    tomcat/trunk/webapps/docs/changelog.xml

Modified: tomcat/trunk/java/org/apache/catalina/connector/Response.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/Response.java?rev=1630911&r1=1630910&r2=1630911&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/Response.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/Response.java Fri Oct 10 
14:28:59 2014
@@ -909,7 +909,7 @@ public class Response
         // the header name is Set-Cookie for both "old" and v.1 ( RFC2109 )
         // RFC2965 is not supported by browsers and the Servlet spec
         // asks for 2109.
-        addHeader("Set-Cookie", header);
+        addHeader("Set-Cookie", header, 
getContext().getCookieProcessor().getCharset());
     }
 
     /**

Added: 
tomcat/trunk/test/org/apache/tomcat/util/http/TestCookieProcessorGenerationHttp.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/util/http/TestCookieProcessorGenerationHttp.java?rev=1630911&view=auto
==============================================================================
--- 
tomcat/trunk/test/org/apache/tomcat/util/http/TestCookieProcessorGenerationHttp.java
 (added)
+++ 
tomcat/trunk/test/org/apache/tomcat/util/http/TestCookieProcessorGenerationHttp.java
 Fri Oct 10 14:28:59 2014
@@ -0,0 +1,86 @@
+/*
+ *  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.
+ */
+package org.apache.tomcat.util.http;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.apache.catalina.Context;
+import org.apache.catalina.startup.Tomcat;
+import org.apache.catalina.startup.TomcatBaseTest;
+import org.apache.tomcat.util.buf.ByteChunk;
+
+public class TestCookieProcessorGenerationHttp extends TomcatBaseTest {
+
+    @Test
+    public void testUtf8CookieValue() throws Exception {
+        Tomcat tomcat = getTomcatInstance();
+        // Must have a real docBase - just use temp
+        Context ctx = tomcat.addContext("", 
System.getProperty("java.io.tmpdir"));
+        ctx.setCookieProcessor(new Rfc6265CookieProcessor());
+        Tomcat.addServlet(ctx, "test", new CookieServlet("\u0120"));
+        ctx.addServletMapping("/test", "test");
+        tomcat.start();
+
+        Map<String,List<String>> headers = new HashMap<>();
+        ByteChunk res = new ByteChunk();
+        getUrl("http://localhost:"; + getPort() + "/test", res, headers);
+        List<String> cookieHeaders = headers.get("Set-Cookie");
+        Assert.assertEquals("There should only be one Set-Cookie header in 
this test",
+                1, cookieHeaders.size());
+        // Client is assuming header is ISO-8859-1 encoding which it isn't. 
Turn
+        // the header value back into the received bytes (this isn't guaranteed
+        // to work with all values but it will for this test value)
+        byte[] headerBytes = 
cookieHeaders.get(0).getBytes(StandardCharsets.ISO_8859_1);
+        // Now convert those bytes to a String using UTF-8
+        String utf8Header = new String(headerBytes, StandardCharsets.UTF_8);
+        Assert.assertEquals("Test=\u0120", utf8Header);
+    }
+
+
+    private static class CookieServlet extends HttpServlet {
+
+        private static final long serialVersionUID = 1L;
+
+        private final String cookieValue;
+
+        public CookieServlet(String cookieValue) {
+            this.cookieValue = cookieValue;
+        }
+
+        @Override
+        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+                throws ServletException, IOException {
+            Cookie cookie = new Cookie("Test", cookieValue);
+            resp.addCookie(cookie);
+            resp.setContentType("text/plain");
+            resp.getWriter().print("OK");
+        }
+    }
+}

Propchange: 
tomcat/trunk/test/org/apache/tomcat/util/http/TestCookieProcessorGenerationHttp.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1630911&r1=1630910&r2=1630911&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Fri Oct 10 14:28:59 2014
@@ -64,6 +64,11 @@
         variables. (markt)
       </add>
       <fix>
+        <bug>55951</bug>: Allow cookies to use UTF-8 encoded values in HTTP
+        headers. This requires the use of the RFC6265
+        <strong>CookieProcessor</strong>. (markt)
+      </fix>
+      <fix>
         <bug>55984</bug>: Using the allow separators in version 0 cookies 
option
         with the legacy cookie processor should only apply to version 0 
cookies.
         Version 1 cookies with values that contain separators should not be



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to