yay cookies
authorKenneth Reitz <me@kennethreitz.com>
Mon, 26 Sep 2011 05:33:18 +0000 (01:33 -0400)
committerKenneth Reitz <me@kennethreitz.com>
Mon, 26 Sep 2011 05:33:18 +0000 (01:33 -0400)
requests/api.py
requests/models.py
requests/utils.py

index 653f82d36493cec78bf5e36a540be29a078f6a9f..5e5bc299b8e5d4a26df6540bff97e90077d31e64 100644 (file)
@@ -49,7 +49,7 @@ def request(method, url,
     if cookies is None:
         cookies = {}
 
-    cookies = cookiejar_from_dict(cookies)
+    cookies = cookiejar_from_dict(cookies)
 
     # Expand header values
     if headers:
index 406abd56b10d10de39e8fddf218e6020679d06f1..101ecb4cd0cf5e06155a195d9dd124778ffb41ca 100644 (file)
@@ -8,6 +8,7 @@ requests.models
 
 import urllib
 import zlib
+from Cookie import SimpleCookie
 from urlparse import urlparse, urlunparse, urljoin
 
 from .packages import urllib3
@@ -133,6 +134,22 @@ class Request(object):
             # Make headers case-insensitive.
             response.headers = CaseInsensitiveDict(getattr(resp, 'headers', None))
 
+            # Start off with our local cookies.
+            cookies = self.cookies or dict()
+
+            # Add new cookies from the server.
+            if 'set-cookie' in response.headers:
+                cookie_header = response.headers['set-cookie']
+
+                c = SimpleCookie()
+                c.load(cookie_header)
+
+                for k,v in c.items():
+                    cookies.update({k: v.value})
+
+            # Save cookies in Response.
+            response.cookies = cookies
+
             # Save original resopnse for later.
             response.raw = resp
 
@@ -240,6 +257,7 @@ class Request(object):
         # Build the final URL.
         url = build_url(self.url, self.params)
 
+        # Nottin' on you.
         body = None
         content_type = None
 
@@ -296,6 +314,20 @@ class Request(object):
                     # Part of a connection pool, so no fancy stuff. Sorry!
                     do_block = True
 
+                if self.cookies:
+                    # Skip if 'cookie' header is explicitly set.
+                    if 'cookie' not in self.headers:
+
+                        # Simple cookie with our dict.
+                        c = SimpleCookie()
+                        c.load(self.cookies)
+
+                        # Turn it into a header.
+                        cookie_header = c.output(header='').strip()
+
+                        # Attach Cookie header to request.
+                        self.headers['Cookie'] = cookie_header
+
                 # Create the connection.
                 r = connection.urlopen(
                     method=self.method,
@@ -313,7 +345,14 @@ class Request(object):
                     self._pools = pools
 
                 # Extract cookies.
-                # if self.cookiejar is not None:
+                if self.cookies is not None:
+                    pass
+                    # cookies = cookiejar_from_dict(self.cookies)
+#                     >>> C = Cookie.SimpleCookie()
+# >>> C["rocky"] = "road"
+# >>> C["rocky"]["path"] = "/cookie"
+# >>> print C.output(header="Cookie:")
+# Cookie: rocky=road; Path=/cookie
                     # self.cookiejar.extract_cookies(resp, req)
 
             # except (urllib2.HTTPError, urllib2.URLError), why:
@@ -332,7 +371,6 @@ class Request(object):
                 self._build_response(r)
                 self.response.ok = True
 
-
         self.sent = self.response.ok
 
         return self.sent
index 30ab901653db5767a2b06324cde822e5ff39641c..c422ac5c37a5e0a4b664b1b019b10fcbaacad2fe 100644 (file)
@@ -117,7 +117,7 @@ def header_expand(headers):
     return ''.join(collector)
 
 
-def dict_from_cookiejar(cj):
+def dict_from_cookiejar(cookies):
     """Returns a key/value dictionary from a CookieJar.
 
     :param cj: CookieJar object to extract cookies from.
@@ -125,7 +125,7 @@ def dict_from_cookiejar(cj):
 
     cookie_dict = {}
 
-    for _, cookies in cj._cookies.items():
+    for _, cookies in cookies.items():
         for _, cookies in cookies.items():
             for cookie in cookies.values():
                 cookie_dict[cookie.name] = cookie.value