Skip to content

Commit ea746b8

Browse files
committed
Fix livetest (and cookie handling) for webtest > 2
Closes peritus#16
1 parent b4eb356 commit ea746b8

File tree

1 file changed

+55
-9
lines changed

1 file changed

+55
-9
lines changed

src/HttpLibrary/livetest.py

Lines changed: 55 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,61 @@
4343
import httplib
4444
import urlparse
4545
from Cookie import BaseCookie, CookieError
46+
from six.moves import http_cookiejar
4647

4748
conn_classes = {'http': httplib.HTTPConnection,
4849
'https': httplib.HTTPSConnection}
4950

5051

52+
class RequestCookieAdapter(object):
53+
"""
54+
this class merely provides the methods required for a
55+
cookielib.CookieJar to work on a webob.Request
56+
57+
potential for yak shaving...very high
58+
"""
59+
def __init__(self, request):
60+
self._request = request
61+
62+
def is_unverifiable(self):
63+
return True # sure? Why not?
64+
65+
@property
66+
def unverifiable(self): # NOQA
67+
# This is undocumented method that Python 3 cookielib uses
68+
return True
69+
70+
def get_full_url(self):
71+
return self._request.url
72+
73+
def get_origin_req_host(self):
74+
return self._request.host
75+
76+
def add_unredirected_header(self, key, header):
77+
self._request.headers[key] = header
78+
79+
def has_header(self, key):
80+
return key in self._request.headers
81+
82+
83+
class ResponseCookieAdapter(object):
84+
"""
85+
cookielib.CookieJar to work on a webob.Response
86+
"""
87+
def __init__(self, response):
88+
self._response = response
89+
90+
def info(self):
91+
return self
92+
93+
def getheaders(self, header):
94+
return self._response.headers.getall(header)
95+
96+
def get_all(self, headers, default): # NOQA
97+
# This is undocumented method that Python 3 cookielib uses
98+
return self._response.headers.getall(headers)
99+
100+
51101
class TestApp(webtest.TestApp):
52102
def _load_conn(self, scheme):
53103
if scheme in conn_classes:
@@ -63,6 +113,7 @@ def __init__(self, host, scheme='http', relative_to=None):
63113
self.extra_environ = {
64114
'wsgi.url_scheme': scheme,
65115
}
116+
self.cookiejar = http_cookiejar.CookieJar()
66117
self.reset()
67118

68119
def _do_httplib_request(self, req):
@@ -109,15 +160,10 @@ def do_request(self, req, status, expect_errors):
109160
self._check_errors(res)
110161
res.cookies_set = {}
111162

112-
for header in res.headers.getall('set-cookie'):
113-
try:
114-
c = BaseCookie(header)
115-
except CookieError, e:
116-
raise CookieError(
117-
"Could not parse cookie header %r: %s" % (header, e))
118-
for key, morsel in c.items():
119-
self.cookies[key] = morsel.value
120-
res.cookies_set[key] = morsel.value
163+
# merge cookies back in
164+
self.cookiejar.extract_cookies(ResponseCookieAdapter(res),
165+
RequestCookieAdapter(req))
166+
121167
return res
122168

123169

0 commit comments

Comments
 (0)