Changelog:
- In non-strict mode each cookie sent with the request is put on a
separate request header.
- In strict mode all cookies are crammed into one request header, as
before

The patch requires the test webapp to be recompiled & redeployed

It's a fairly minor change blessed by Jandalf long time ago. I'll commit
this patch later today or tomorrow if nobody loudly complains.

Your cookie monster
Index: java/org/apache/commons/httpclient/HttpMethodBase.java
===================================================================
RCS file: /home/cvspublic/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpMethodBase.java,v
retrieving revision 1.113
diff -u -r1.113 HttpMethodBase.java
--- java/org/apache/commons/httpclient/HttpMethodBase.java	16 Feb 2003 17:56:17 -0000	1.113
+++ java/org/apache/commons/httpclient/HttpMethodBase.java	17 Feb 2003 19:49:53 -0000
@@ -1317,7 +1317,17 @@
         Cookie[] cookies = matcher.match(conn.getHost(), conn.getPort(),
             getPath(), conn.isSecure(), state.getCookies());
         if ((cookies != null) && (cookies.length > 0)) {
-            setRequestHeader(matcher.formatCookieHeader(cookies));
+            if (this.isStrictMode()) {
+                // In strict mode put all cookies on the same header
+                getRequestHeaderGroup().addHeader(
+                  matcher.formatCookieHeader(cookies));
+            } else {
+                // In non-strict mode put each cookie on a separate header
+                for (int i = 0; i < cookies.length; i++) {
+                    getRequestHeaderGroup().addHeader(
+                      matcher.formatCookieHeader(cookies[i]));
+                }
+            }
         }
     }
 
Index: java/org/apache/commons/httpclient/cookie/CookieSpecBase.java
===================================================================
RCS file: /home/cvspublic/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/cookie/CookieSpecBase.java,v
retrieving revision 1.11
diff -u -r1.11 CookieSpecBase.java
--- java/org/apache/commons/httpclient/cookie/CookieSpecBase.java	30 Jan 2003 05:01:55 -0000	1.11
+++ java/org/apache/commons/httpclient/cookie/CookieSpecBase.java	17 Feb 2003 19:49:55 -0000
@@ -375,8 +375,8 @@
                     + paramValue);
             }
         } else {
-            if (LOG.isWarnEnabled()) {
-                LOG.warn("Unrecognized cookie attribute: " 
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("Unrecognized cookie attribute: " 
                     + attribute.toString());
             }
         }
Index: test/org/apache/commons/httpclient/TestWebappCookie.java
===================================================================
RCS file: /home/cvspublic/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestWebappCookie.java,v
retrieving revision 1.9
diff -u -r1.9 TestWebappCookie.java
--- test/org/apache/commons/httpclient/TestWebappCookie.java	2 Feb 2003 11:05:20 -0000	1.9
+++ test/org/apache/commons/httpclient/TestWebappCookie.java	17 Feb 2003 19:49:46 -0000
@@ -109,6 +109,7 @@
 
     public void testSetCookieGet() throws Exception {
         HttpClient client = new HttpClient();
+        client.setStrictMode(true);
         client.getHostConfiguration().setHost(host, port, "http");
         GetMethod method = new GetMethod("/" + context + "/cookie/write");
         method.setQueryString("simple=set");
@@ -129,6 +130,7 @@
 
     public void testSetCookiePost() throws Exception {
         HttpClient client = new HttpClient();
+        client.setStrictMode(true);
         client.getHostConfiguration().setHost(host, port, "http");
         PostMethod method = new PostMethod("/" + context + "/cookie/write");
         method.setRequestBody(new NameValuePair[] { new NameValuePair("simple","set") } );
@@ -149,6 +151,7 @@
 
     public void testSetCookiePut() throws Exception {
         HttpClient client = new HttpClient();
+        client.setStrictMode(true);
         client.getHostConfiguration().setHost(host, port, "http");
         PutMethod method = new PutMethod("/" + context + "/cookie/write");
         method.setQueryString("simple=set");
@@ -169,6 +172,7 @@
 
     public void testSetExpiredCookieGet() throws Exception {
         HttpClient client = new HttpClient();
+        client.setStrictMode(true);
         client.getHostConfiguration().setHost(host, port, "http");
         GetMethod method = new GetMethod("/" + context + "/cookie/write");
         method.setQueryString("simple=unset");
@@ -187,6 +191,7 @@
 
     public void testSetExpiredCookiePut() throws Exception {
         HttpClient client = new HttpClient();
+        client.setStrictMode(true);
         client.getHostConfiguration().setHost(host, port, "http");
         PutMethod method = new PutMethod("/" + context + "/cookie/write");
         method.setQueryString("simple=unset");
@@ -205,6 +210,7 @@
 
     public void testSetUnsetCookieGet() throws Exception {
         HttpClient client = new HttpClient();
+        client.setStrictMode(true);
         client.getHostConfiguration().setHost(host, port, "http");
         GetMethod method = new GetMethod("/" + context + "/cookie/write");
         method.setQueryString("simple=set");
@@ -238,8 +244,9 @@
         assertEquals(0,client.getState().getCookies().length);
     }
 
-    public void testSetMultiCookieGet() throws Exception {
+    public void testSetMultiCookieGetStrict() throws Exception {
         HttpClient client = new HttpClient();
+        client.setStrictMode(true);
         client.getHostConfiguration().setHost(host, port, "http");
         GetMethod method = new GetMethod("/" + context + "/cookie/write");
         method.setQueryString("simple=set&domain=set");
@@ -261,8 +268,48 @@
         assertEquals("value",((Cookie)(client.getState().getCookies()[1])).getValue());
     }
 
+
+    public void testMultiSendCookieGetNonstrict() throws Exception {
+        HttpClient client = new HttpClient();
+        client.getHostConfiguration().setHost(host, port, "http");
+        GetMethod method = new GetMethod("/" + context + "/cookie/write");
+        method.setQueryString("simple=set&domain=set");
+        try {
+            client.executeMethod(method);
+        } catch (Throwable t) {
+            t.printStackTrace();
+            fail("Unable to execute method : " + t.toString());
+        }
+        assertEquals(200,method.getStatusCode());
+        assertTrue(method.getResponseBodyAsString().indexOf("<title>WriteCookieServlet: GET</title>") >= 0);
+        assertTrue(method.getResponseBodyAsString().indexOf("Wrote simplecookie.<br>") >= 0);
+        assertTrue(method.getResponseBodyAsString().indexOf("Wrote domaincookie.<br>") >= 0);
+        assertEquals(2,client.getState().getCookies().length);
+        assertEquals("simplecookie", ((Cookie)(client.getState().getCookies()[0])).getName());
+        assertEquals("value",((Cookie)(client.getState().getCookies()[0])).getValue());
+        assertEquals("domaincookie", ((Cookie)(client.getState().getCookies()[1])).getName());
+        assertEquals("value",((Cookie)(client.getState().getCookies()[1])).getValue());
+
+        GetMethod method2 = new GetMethod("/" + context + "/cookie/read");
+        try {
+            client.executeMethod(method2);
+        } catch (Throwable t) {
+            t.printStackTrace();
+            fail("Unable to execute method : " + t.toString());
+        }
+        assertEquals(200,method2.getStatusCode());
+        String s = method2.getResponseBodyAsString();
+        assertTrue(s, s.indexOf("<title>ReadCookieServlet: GET</title>") >= 0);
+        assertTrue(s, s.indexOf("<p><tt>Cookie: $Version=\"1\"; simplecookie=\"value\"</tt></p>") >= 0);
+        assertTrue(s, s.indexOf("<p><tt>Cookie: $Version=\"1\"; domaincookie=\"value\"; $Domain=\"" + host + "\"</tt></p>") >= 0);
+        assertTrue(s, s.indexOf("<tt>simplecookie=\"value\"</tt><br>") >= 0);
+        assertTrue(s, s.indexOf("<tt>domaincookie=\"value\"</tt><br>") >= 0);
+    }
+
+
     public void testSetMultiCookiePut() throws Exception {
         HttpClient client = new HttpClient();
+        client.setStrictMode(true);
         client.getHostConfiguration().setHost(host, port, "http");
         PutMethod method = new PutMethod("/" + context + "/cookie/write");
         method.setQueryString("simple=set&domain=set");
@@ -286,6 +333,7 @@
 
     public void testSendCookieGet() throws Exception {
         HttpClient client = new HttpClient();
+        client.setStrictMode(true);
         client.getHostConfiguration().setHost(host, port, "http");
         GetMethod method = new GetMethod("/" + context + "/cookie/write");
         method.setQueryString("simple=set");
@@ -320,6 +368,7 @@
 
     public void testMultiSendCookieGet() throws Exception {
         HttpClient client = new HttpClient();
+        client.setStrictMode(true);
         client.getHostConfiguration().setHost(host, port, "http");
         GetMethod method = new GetMethod("/" + context + "/cookie/write");
         method.setQueryString("simple=set&domain=set");
@@ -358,6 +407,7 @@
 
     public void testDeleteCookieGet() throws Exception {
         HttpClient client = new HttpClient();
+        client.setStrictMode(true);
         client.getHostConfiguration().setHost(host, port, "http");
 
         {
@@ -435,6 +485,7 @@
 
     public void testDeleteCookiePut() throws Exception {
         HttpClient client = new HttpClient();
+        client.setStrictMode(true);
         client.getHostConfiguration().setHost(host, port, "http");
 
         {
@@ -655,7 +706,7 @@
             }
             assertEquals(200,method.getStatusCode());
             assertTrue(method.getResponseBodyAsString().indexOf("<title>ReadCookieServlet: GET</title>") >= 0);
-            assertTrue(method.getResponseBodyAsString(),method.getResponseBodyAsString().indexOf("<p><tt>Cookie: null</tt></p>") >= 0);
+            assertTrue(method.getResponseBodyAsString(),method.getResponseBodyAsString().indexOf("<p><tt>Cookie: ") == -1);
             assertTrue(method.getResponseBodyAsString().indexOf("<tt>pathcookie=value</tt><br>") == -1);
         }
     }
Index: test-webapp/src/org/apache/commons/httpclient/ReadCookieServlet.java
===================================================================
RCS file: /home/cvspublic/jakarta-commons/httpclient/src/test-webapp/src/org/apache/commons/httpclient/ReadCookieServlet.java,v
retrieving revision 1.3
diff -u -r1.3 ReadCookieServlet.java
--- test-webapp/src/org/apache/commons/httpclient/ReadCookieServlet.java	23 Jan 2003 22:48:49 -0000	1.3
+++ test-webapp/src/org/apache/commons/httpclient/ReadCookieServlet.java	17 Feb 2003 19:49:43 -0000
@@ -76,7 +76,10 @@
         out.println("<head><title>ReadCookieServlet: " + request.getMethod() + "</title></head>");
         out.println("<body>");
         out.println("<p>This is a response to an HTTP " + request.getMethod() + " request.</p>");
-        out.println("<p><tt>Cookie: " + request.getHeader("Cookie") + "</tt></p>");
+        Enumeration enum = request.getHeaders("Cookie");
+        while (enum.hasMoreElements()) {
+            out.println("<p><tt>Cookie: " + (String)enum.nextElement() + "</tt></p>");
+        }
         Cookie[] cookies = request.getCookies();
         if(null != cookies) {
             for(int i=0;i<cookies.length;i++) {

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to