[Python-Dev] Cookie.py and `:' in the key

Barry A. Warsaw barry@zope.com
Tue, 2 Oct 2001 21:39:04 -0400


In Mailman, I use a version of Cookie.py written by Timothy dated from
1998.  I'm now trying to see if I can get rid of my independent
copy and just use Cookie.py in the Python 2.x standard library.

I've hit a snag; in Mailman's copy, it is legal to have a `:' in the
key name, but in Python's Cookie.py it isn't:

-------------------- snip snip --------------------
% python
Python 2.1.1 (#1, Aug 31 2001, 17:07:00) 
[GCC egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)] on linux2
Type "copyright", "credits" or "license" for more information.
>>> import Cookie
>>> c = Cookie.Cookie()
>>> c['foo:bar'] = 'hello'
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "/usr/local/lib/python2.1/Cookie.py", line 583, in __setitem__
    self.__set(key, rval, cval)
  File "/usr/local/lib/python2.1/Cookie.py", line 576, in __set
    M.set(key, real_value, coded_value)
  File "/usr/local/lib/python2.1/Cookie.py", line 456, in set
    raise CookieError("Illegal key value: %s" % key)
Cookie.CookieError: Illegal key value: foo:bar
>>> 
% PYTHONPATH=/path/to/mailman/misc python
Python 2.1.1 (#1, Aug 31 2001, 17:07:00) 
[GCC egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)] on linux2
Type "copyright", "credits" or "license" for more information.
>>> import Cookie
>>> c = Cookie.Cookie()
>>> c['foo:bar'] = 'hello'
>>> print c
Set-Cookie: foo:bar=hello;
>>> 
-------------------- snip snip --------------------

I don't see any reason why `:' shouldn't be allowed in Set-Cookie:
value, but maybe I'm missing something in the RFCs.  This patch fixes
the problem but perhaps not in the right way.  Comments?

-Barry

-------------------- snip snip --------------------
Index: Cookie.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/Cookie.py,v
retrieving revision 1.11
diff -u -r1.11 Cookie.py
--- Cookie.py	2001/08/02 07:15:29	1.11
+++ Cookie.py	2001/10/03 01:38:39
@@ -249,7 +249,7 @@
 #       _LegalChars       is the list of chars which don't require "'s
 #       _Translator       hash-table for fast quoting
 #
-_LegalChars       = string.ascii_letters + string.digits + "!#$%&'*+-.^_`|~"
+_LegalChars       = string.ascii_letters + string.digits + "!#$%&'*+-.^_`|~:"
 _Translator       = {
     '\000' : '\\000',  '\001' : '\\001',  '\002' : '\\002',
     '\003' : '\\003',  '\004' : '\\004',  '\005' : '\\005',