diff --git a/.gitignore b/.gitignore index e5cfd99e..88e2b4f5 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ MANIFEST coverage.xml nosetests.xml -pylint.txt \ No newline at end of file +pylint.txt +*.pyc diff --git a/AUTHORS b/AUTHORS index 217400d0..62a2414d 100644 --- a/AUTHORS +++ b/AUTHORS @@ -13,4 +13,7 @@ Patches and Suggestions - Various Pocoo Members - Chris Adams - Flavio Percoco Premoli -- Dj Gilcrease \ No newline at end of file +- Dj Gilcrease +- Justin Murphy +- Rob Madole +- Aram Dulyan diff --git a/HISTORY.rst b/HISTORY.rst index 49e00f4e..c0b00d69 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -1,6 +1,14 @@ History ------- +0.3.1 (2011-04-01) +++++++++++++++++++ + +* Cookie Changes +* Response.read() +* Poster fix + + 0.3.0 (2011-02-25) ++++++++++++++++++ diff --git a/requests/core.py b/requests/core.py index b426a4e9..56c3d061 100644 --- a/requests/core.py +++ b/requests/core.py @@ -24,8 +24,8 @@ from .packages.poster.streaminghttp import register_openers, get_handlers __title__ = 'requests' -__version__ = '0.3.0' -__build__ = 0x000300 +__version__ = '0.3.1' +__build__ = 0x000301 __author__ = 'Kenneth Reitz' __license__ = 'ISC' __copyright__ = 'Copyright 2011 Kenneth Reitz' @@ -111,6 +111,9 @@ class Request(object): _handlers = [] + if self.cookiejar is not None: + _handlers.append(urllib2.HTTPCookieProcessor(self.cookiejar)) + if self.auth: if not isinstance(self.auth.handler, (urllib2.AbstractBasicAuthHandler, urllib2.AbstractDigestAuthHandler)): auth_manager.add_password(self.auth.realm, self.url, self.auth.username, self.auth.password) @@ -119,12 +122,22 @@ class Request(object): _handlers.append(self.auth.handler) - _handlers.extend(get_handlers()) - opener = urllib2.build_opener(*_handlers) - return opener.open - else: + if not _handlers: return urllib2.urlopen + _handlers.extend(get_handlers()) + opener = urllib2.build_opener(*_handlers) + + if self.headers: + # Allow default headers in the opener to be overloaded + normal_keys = [k.capitalize() for k in self.headers] + for key, val in opener.addheaders[:]: + if key not in normal_keys: + continue + # Remove it, we have a value to take its place + opener.addheaders.remove((key, val)) + + return opener.open def _build_response(self, resp): """Build internal Response object from given response.""" @@ -147,7 +160,6 @@ class Request(object): else: return url - def send(self, anyway=False): """Sends the request. Returns True of successful, false if not. If there was an HTTPError during transmission, @@ -178,12 +190,16 @@ class Request(object): req = _Request(self.url, data=self._enc_data, method=self.method) if self.headers: - req.headers = self.headers + req.headers.update(self.headers) if not self.sent or anyway: try: opener = self._get_opener() - resp = opener(req) + resp = opener(req) + + if self.cookiejar is not None: + self.cookiejar.extract_cookies(resp, req) + except urllib2.HTTPError, why: self._build_response(why) self.response.error = why @@ -195,12 +211,13 @@ class Request(object): else: self.response.cached = True - self.sent = self.response.ok return self.sent + def read(self): + return self.response.read() class Response(object): """The :class:`Request` object. All :class:`Request` objects contain a @@ -232,6 +249,8 @@ class Response(object): if self.error: raise self.error + def read(self): + return self.content class AuthManager(object): @@ -423,7 +442,7 @@ def get(url, params={}, headers={}, cookies=None, auth=None): :param auth: (optional) AuthObject to enable Basic HTTP Auth. """ - return request('GET', url, params=params, headers=headers, cookiejar=cookies, auth=auth) + return request('GET', url, params=params, headers=headers, cookies=cookies, auth=auth) def head(url, params={}, headers={}, cookies=None, auth=None): @@ -436,7 +455,7 @@ def head(url, params={}, headers={}, cookies=None, auth=None): :param auth: (optional) AuthObject to enable Basic HTTP Auth. """ - return request('HEAD', url, params=params, headers=headers, cookiejar=cookies, auth=auth) + return request('HEAD', url, params=params, headers=headers, cookies=cookies, auth=auth) def post(url, data={}, headers={}, files=None, cookies=None, auth=None): @@ -450,7 +469,7 @@ def post(url, data={}, headers={}, files=None, cookies=None, auth=None): :param auth: (optional) AuthObject to enable Basic HTTP Auth. """ - return request('POST', url, data=data, headers=headers, files=files, cookiejar=cookies, auth=auth) + return request('POST', url, data=data, headers=headers, files=files, cookies=cookies, auth=auth) def put(url, data='', headers={}, files={}, cookies=None, auth=None): @@ -464,7 +483,7 @@ def put(url, data='', headers={}, files={}, cookies=None, auth=None): :param auth: (optional) AuthObject to enable Basic HTTP Auth. """ - return request('PUT', url, data=data, headers=headers, files=files, cookiejar=cookies, auth=auth) + return request('PUT', url, data=data, headers=headers, files=files, cookies=cookies, auth=auth) def delete(url, params={}, headers={}, cookies=None, auth=None): @@ -477,7 +496,7 @@ def delete(url, params={}, headers={}, cookies=None, auth=None): :param auth: (optional) AuthObject to enable Basic HTTP Auth. """ - return request('DELETE', url, params=params, headers=headers, cookiejar=cookies, auth=auth) + return request('DELETE', url, params=params, headers=headers, cookies=cookies, auth=auth) diff --git a/test_requests.py b/test_requests.py index 22716f13..c3759f31 100644 --- a/test_requests.py +++ b/test_requests.py @@ -2,6 +2,7 @@ # -*- coding: utf-8 -*- import unittest +import cookielib import requests @@ -28,19 +29,24 @@ class RequestsTestSuite(unittest.TestCase): self.assertEqual(r.status_code, 200) def test_HTTP_200_OK_GET_WITH_PARAMS(self): - heads = {'User-agent': 'Mozilla/5.0'} r = requests.get('http://www.google.com/search', params={'q': 'test'}, headers=heads) self.assertEqual(r.status_code, 200) - def test_HTTP_200_OK_GET_WITH_MIXED_PARAMS(self): - heads = {'User-agent': 'Mozilla/5.0'} r = requests.get('http://google.com/search?test=true', params={'q': 'test'}, headers=heads) self.assertEqual(r.status_code, 200) + + def test_user_agent_transfers(self): + """Issue XX""" + heads = {'User-agent': + 'Mozilla/5.0 (github.com/kennethreitz/requests)'} + + r = requests.get('http://whatsmyua.com', headers=heads); + self.assertTrue(heads['User-agent'] in r.content) def test_HTTP_200_OK_HEAD(self): r = requests.head('http://google.com') @@ -64,7 +70,6 @@ class RequestsTestSuite(unittest.TestCase): requests.auth_manager.empty() def test_POSTBIN_GET_POST_FILES(self): - bin = requests.post('http://www.postbin.org/') print bin.url self.assertEqual(bin.status_code, 200) @@ -76,7 +81,6 @@ class RequestsTestSuite(unittest.TestCase): self.assertEqual(post2.status_code, 201) def test_POSTBIN_GET_POST_FILES_WITH_PARAMS(self): - bin = requests.post('http://www.postbin.org/') self.assertEqual(bin.status_code, 200) @@ -84,6 +88,16 @@ class RequestsTestSuite(unittest.TestCase): post2 = requests.post(bin.url, files={'some': open('test_requests.py')}, data={'some': 'data'}) self.assertEqual(post2.status_code, 201) + + def test_POSTBIN_GET_POST_FILES_WITH_HEADERS(self): + bin = requests.post('http://www.postbin.org/') + self.assertEqual(bin.status_code, 200) + + post2 = requests.post(bin.url, files={'some': open('test_requests.py')}, + headers={'User-Agent': 'requests-tests'}) + + self.assertEqual(post2.status_code, 201) + def test_nonzero_evaluation(self): r = requests.get('http://google.com/some-404-url') self.assertEqual(bool(r), False) @@ -103,6 +117,15 @@ class RequestsTestSuite(unittest.TestCase): self.assertFalse(r.error) r.raise_for_status() + def test_cookie_jar(self): + """ + .. todo:: This really doesn't test to make sure the cookie is working + """ + jar = cookielib.CookieJar() + self.assertFalse(jar) + + requests.get('http://google.com', cookies=jar) + self.assertTrue(jar)