43
43
import httplib
44
44
import urlparse
45
45
from Cookie import BaseCookie , CookieError
46
+ from six .moves import http_cookiejar
46
47
47
48
conn_classes = {'http' : httplib .HTTPConnection ,
48
49
'https' : httplib .HTTPSConnection }
49
50
50
51
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
+
51
101
class TestApp (webtest .TestApp ):
52
102
def _load_conn (self , scheme ):
53
103
if scheme in conn_classes :
@@ -63,6 +113,7 @@ def __init__(self, host, scheme='http', relative_to=None):
63
113
self .extra_environ = {
64
114
'wsgi.url_scheme' : scheme ,
65
115
}
116
+ self .cookiejar = http_cookiejar .CookieJar ()
66
117
self .reset ()
67
118
68
119
def _do_httplib_request (self , req ):
@@ -109,15 +160,10 @@ def do_request(self, req, status, expect_errors):
109
160
self ._check_errors (res )
110
161
res .cookies_set = {}
111
162
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
+
121
167
return res
122
168
123
169
0 commit comments