Index: trac/web/api.py =================================================================== --- trac/web/api.py (revision 3731) +++ trac/web/api.py (working copy) @@ -15,7 +15,7 @@ # Author: Christopher Lenz from BaseHTTPServer import BaseHTTPRequestHandler -from Cookie import SimpleCookie as Cookie +from Cookie import CookieError, BaseCookie, SimpleCookie import cgi import mimetypes import os @@ -93,6 +93,27 @@ """ +class Cookie(SimpleCookie): + def load(self, rawdata, ignore_parse_errors=False): + if ignore_parse_errors: + self.bad_cookies = [] + self._BaseCookie__set = self._loose_set + SimpleCookie.load(self, rawdata) + if ignore_parse_errors: + self._BaseCookie__set = self._strict_set + for key in self.bad_cookies: + del self[key] + + _strict_set = BaseCookie._BaseCookie__set + + def _loose_set(self, key, real_value, coded_value): + try: + self._strict_set(key, real_value, coded_value) + except CookieError: + self.bad_cookies.append(key) + dict.__setitem__(self, key, None) + + class Request(object): """Represents a HTTP request/response pair. @@ -130,7 +151,7 @@ self.incookie = Cookie() cookie = self.get_header('Cookie') if cookie: - self.incookie.load(cookie) + self.incookie.load(cookie, ignore_parse_errors=True) self.outcookie = Cookie() self.base_url = self.environ.get('trac.base_url') Index: trac/web/tests/api.py =================================================================== --- trac/web/tests/api.py (revision 3731) +++ trac/web/tests/api.py (working copy) @@ -96,7 +96,12 @@ req.write(u'Föö') self.assertEqual('Föö', buf.getvalue()) + def test_invalid_cookies(self): + environ = self._make_environ(HTTP_COOKIE='bad:key=value;') + req = Request(environ, None) + self.assertEqual('', str(req.incookie)) + def suite(): suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(RequestTestCase, 'test'))