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...@apache.org on 2007/07/25 04:19:41 UTC

svn commit: r559283 - /tomcat/connectors/branches/tc5.0.x/util/java/org/apache/tomcat/util/http/ServerCookie.java

Author: markt
Date: Tue Jul 24 19:19:40 2007
New Revision: 559283

URL: http://svn.apache.org/viewvc?view=rev&rev=559283
Log:
Port changes from 5.5

Modified:
    tomcat/connectors/branches/tc5.0.x/util/java/org/apache/tomcat/util/http/ServerCookie.java

Modified: tomcat/connectors/branches/tc5.0.x/util/java/org/apache/tomcat/util/http/ServerCookie.java
URL: http://svn.apache.org/viewvc/tomcat/connectors/branches/tc5.0.x/util/java/org/apache/tomcat/util/http/ServerCookie.java?view=diff&rev=559283&r1=559282&r2=559283
==============================================================================
--- tomcat/connectors/branches/tc5.0.x/util/java/org/apache/tomcat/util/http/ServerCookie.java (original)
+++ tomcat/connectors/branches/tc5.0.x/util/java/org/apache/tomcat/util/http/ServerCookie.java Tue Jul 24 19:19:40 2007
@@ -123,6 +123,7 @@
     //
     // private static final String tspecials = "()<>@,;:\\\"/[]?={} \t";
     private static final String tspecials = ",;";
+    private static final String tspecials2 = ",; \"";
 
     /*
      * Tests a string and returns true if the string counts as a
@@ -147,6 +148,20 @@
 	return true;
     }
 
+    public static boolean isToken2(String value) {
+        if( value==null) return true;
+        int len = value.length();
+
+        for (int i = 0; i < len; i++) {
+            char c = value.charAt(i);
+
+            if (c < 0x20 || c >= 0x7f || tspecials2.indexOf(c) != -1)
+                return false;
+        }
+        return true;
+    }
+
+
     public static boolean checkName( String name ) {
 	if (!isToken(name)
 		|| name.equalsIgnoreCase("Comment")	// rfc2019
@@ -206,7 +221,7 @@
         // this part is the same for all cookies
 	buf.append( name );
         buf.append("=");
-        maybeQuote(version, buf, value);
+        maybeQuote2(version, buf, value);
 
 	// XXX Netscape cookie: "; "
  	// add version 1 specific information
@@ -276,16 +291,56 @@
 		throw new IllegalArgumentException( value );
 	    else {
 		buf.append ('"');
-		buf.append (value);
+		buf.append (escapeDoubleQuotes(value));
 		buf.append ('"');
 	    }
 	}
     }
 
+    public static void maybeQuote2 (int version, StringBuffer buf,
+            String value) {
+        // special case - a \n or \r  shouldn't happen in any case
+        if (isToken2(value)) {
+            buf.append(value);
+        } else {
+            buf.append('"');
+            buf.append(escapeDoubleQuotes(value));
+            buf.append('"');
+        }
+    }
+
+
     // log
     static final int dbg=1;
     public static void log(String s ) {
 	System.out.println("ServerCookie: " + s);
+    }
+
+    /**
+     * Escapes any double quotes in the given string.
+     *
+     * @param s the input string
+     *
+     * @return The (possibly) escaped string
+     */
+    private static String escapeDoubleQuotes(String s) {
+
+        if (s == null || s.length() == 0 || s.indexOf('"') == -1) {
+            return s;
+        }
+
+        StringBuffer b = new StringBuffer();
+        char p = s.charAt(0);
+        for (int i = 0; i < s.length(); i++) {
+            char c = s.charAt(i);
+            if (c == '"' && p != '\\')
+                b.append('\\').append('"');
+            else
+                b.append(c);
+            p = c;
+        }
+
+        return b.toString();
     }
 
 }



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