From 3f96c521f3677e3f91c68e8f113f4f21568499e1 Mon Sep 17 00:00:00 2001 From: Mathieu Clabaut Date: Sat, 8 Oct 2016 16:42:22 +0200 Subject: [PATCH] Allow cookie to contains several '=' close #1500 --- gluon/contrib/webclient.py | 18 ++++++++++++------ gluon/tests/test_web.py | 18 ++++++++++++++++++ 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/gluon/contrib/webclient.py b/gluon/contrib/webclient.py index c5e7f3c7..7f6e288b 100644 --- a/gluon/contrib/webclient.py +++ b/gluon/contrib/webclient.py @@ -46,6 +46,17 @@ class WebClient(object): self.default_headers = default_headers self.sessions = {} self.session_regex = session_regex and re.compile(session_regex) + self.headers = {} + + def _parse_headers_in_cookies(self): + self.cookies = {} + if 'set-cookie' in self.headers: + for item in self.headers['set-cookie'].split(','): + cookie = item[:item.find(';')] + pos = cookie.find('=') + key = cookie[:pos] + value = cookie[pos+1:] + self.cookies[key.strip()] = value.strip() def get(self, url, cookies=None, headers=None, auth=None): return self.post(url, data=None, cookies=cookies, @@ -149,12 +160,7 @@ class WebClient(object): else: raise error - # parse headers into cookies - self.cookies = {} - if 'set-cookie' in self.headers: - for item in self.headers['set-cookie'].split(','): - key, value = item[:item.find(';')].split('=') - self.cookies[key.strip()] = value.strip() + self._parse_headers_in_cookies() # check is a new session id has been issued, symptom of broken session if self.session_regex is not None: diff --git a/gluon/tests/test_web.py b/gluon/tests/test_web.py index 4a3ef3bf..adac0f28 100644 --- a/gluon/tests/test_web.py +++ b/gluon/tests/test_web.py @@ -49,6 +49,24 @@ def stopwebserver(): webserverprocess.terminate() +class Cookie(unittest.TestCase): + def testParseMultipleEquals(self): + """ Test for issue #1500. + Ensure that a cookie containing one or more '=' is correctly parsed + """ + client = WebClient() + client.headers['set-cookie'] = "key = value with one =;" + client._parse_headers_in_cookies() + self.assertIn("key", client.cookies) + self.assertEqual(client.cookies['key'], "value with one =") + + client.headers['set-cookie'] = "key = value with one = and another one =;" + client._parse_headers_in_cookies() + client._parse_headers_in_cookies() + self.assertIn("key", client.cookies) + self.assertEqual(client.cookies['key'], "value with one = and another one =") + + class LiveTest(unittest.TestCase): @classmethod