from .status_codes import codes
from .auth import HTTPBasicAuth, HTTPProxyAuth
+from .packages.oreos.cookiejar import CookieJar
from .packages.urllib3.response import HTTPResponse
from .packages.urllib3.exceptions import MaxRetryError, LocationParseError
from .packages.urllib3.exceptions import SSLError as _SSLError
self.auth = auth
#: CookieJar to attach to :class:`Request <Request>`.
- self.cookies = dict(cookies or [])
+ if isinstance(cookies, CookieJar):
+ self.cookies = cookies
+ else:
+ self.cookies = CookieJar()
+
+ # Add passed cookies in.
+ if cookies is not None:
+ self.cookies.update(cookies)
#: True if Request has been sent.
self.sent = False
# Pass settings over.
response.config = self.config
+ # Save original response for later.
+ response.raw = resp
+ response.url = self.full_url
+
if resp:
# Fallback to None if there's no status_code, for whatever reason.
response.status_code = getattr(resp, 'status', None)
-
+
# Make headers case-insensitive.
response.headers = CaseInsensitiveDict(getattr(resp, 'headers', None))
# Set encoding.
response.encoding = get_encoding_from_headers(response.headers)
- # 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']
- cookies = dict_from_string(cookie_header)
+ self.cookies.extract_cookies(response, self)
# Save cookies in Response.
- response.cookies = cookies
+ response.cookies = self.cookies
# No exceptions were harmed in the making of this request.
response.error = getattr(resp, 'error', None)
r = build(resp)
- self.cookies.update(r.cookies)
-
if r.status_code in REDIRECT_STATI and not self.redirect:
while (('location' in r.headers) and
request.send()
r = request.response
- self.cookies.update(r.cookies)
r.history = history
self.response = r
self.response.request = self
- self.response.cookies.update(self.cookies)
@staticmethod
def _encode_params(data):
if not self.sent or anyway:
- if self.cookies:
-
- # Skip if 'cookie' header is explicitly set.
- if 'cookie' not in self.headers:
-
- # Simple cookie with our dict.
- c = SimpleCookie()
- for (k, v) in list(self.cookies.items()):
- c[k] = v
-
- # Turn it into a header.
- cookie_header = c.output(header='', sep='; ').strip()
+ # Skip if 'cookie' header is explicitly set.
+ if 'cookie' not in self.headers:
+ # Turn it into a header.
+ cookie_header = self.cookies.get_header(self)
+
+ if cookie_header:
# Attach Cookie header to request.
self.headers['Cookie'] = cookie_header
+"""
+Wrapper for CookieJar allow dict-like access.
+Ideally there would be wrappers for LWPCookieJar and MozillaCookieJar as well.
+"""
+
import urlparse
import Cookie
from Cookie import Morsel
return urlparse.urlparse(self._r.full_url).netloc
def get_origin_req_host(self):
- if self._r.history:
- r = self._r.history[0]
+ if self._r.response.history:
+ r = self._r.response.history[0]
return urlparse.urlparse(r).netloc
else:
return self.get_host()
def is_unverifiable(self):
# unverifiable == redirected
- return bool(self.history)
+ return bool(self._r.response.history)
class MockResponse:
"""
def getheaders(self, name):
self._r.msg.getheaders(name)
-class CookieJar(cookielib.LWPCookieJar, collections.MutableMapping):
+class CookieJar(cookielib.CookieJar, collections.MutableMapping):
def extract_cookies(self, response, request):
if response.raw._original_response:
req = MockRequest(request)
from .hooks import dispatch_hook
from .utils import header_expand
from .packages.urllib3.poolmanager import PoolManager
-
+from .packages.oreos.cookiejar import CookieJar
def merge_kwargs(local_kwarg, default_kwarg):
"""Merges kwarg dictionaries.
cert=None):
self.headers = headers or {}
- self.cookies = cookies or {}
self.auth = auth
self.timeout = timeout
self.proxies = proxies or {}
self.init_poolmanager()
# Set up a CookieJar to be used by default
- self.cookies = {}
-
- # Add passed cookies in.
- if cookies is not None:
- self.cookies.update(cookies)
+ if isinstance(cookies, CookieJar):
+ self.cookies = cookies
+ else:
+ self.cookies = CookieJar()
+
+ # Add passed cookies in.
+ if cookies is not None:
+ self.cookies.update(cookies)
def init_poolmanager(self):
self.poolmanager = PoolManager(
method = str(method).upper()
# Default empty dicts for dict params.
- cookies = {} if cookies is None else cookies
data = {} if data is None else data
files = {} if files is None else files
headers = {} if headers is None else headers