From 9f55f503b1c5a2b5146792613eb17ba4cad47b68 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Fri, 9 Mar 2012 08:43:12 -0800 Subject: [PATCH] merge conflict and fixes for python3 --- AUTHORS.rst | 1 + requests/models.py | 7 +++++-- tests/test_requests_ext.py | 52 ++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 56 insertions(+), 4 deletions(-) diff --git a/AUTHORS.rst b/AUTHORS.rst index 19729a1..0e6e7ef 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -86,3 +86,4 @@ Patches and Suggestions - Honza Javorek - Brendan Maguire - Chris Dary +- Danver Braganza diff --git a/requests/models.py b/requests/models.py index 4f05601..a354eb2 100644 --- a/requests/models.py +++ b/requests/models.py @@ -235,7 +235,10 @@ class Request(object): # Facilitate non-RFC2616-compliant 'location' headers # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') if not urlparse(url).netloc: - url = urljoin(r.url, url) + url = urljoin(r.url, + # Compliant with RFC3986, we percent + # encode the url. + requote_uri(url)) # http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4 if r.status_code is codes.see_other: @@ -681,7 +684,7 @@ class Response(object): while 1: #XXX correct line size? (httplib has 64kb, seems insane) pending_bytes = fp.readline(40).strip() - if pending_bytes == '': + if not len(pending_bytes): # No content, like a HEAD request. Break out. break pending_bytes = int(pending_bytes, 16) diff --git a/tests/test_requests_ext.py b/tests/test_requests_ext.py index 2102a5e..1e4d89b 100644 --- a/tests/test_requests_ext.py +++ b/tests/test_requests_ext.py @@ -8,6 +8,7 @@ sys.path.insert(0, os.path.abspath('..')) import unittest import requests +from requests.compat import is_py2, is_py3 try: import omnijson as json @@ -45,12 +46,23 @@ class RequestsTestSuite(unittest.TestCase): def test_binary_post(self): - utf8_string = (u'Smörgås').encode('utf-8') + '''We need to be careful how we build the utf-8 string since + unicode literals are a syntax error in python3 + ''' + + if is_py2: + # Blasphemy! + utf8_string = eval("u'Smörgås'.encode('utf-8')") + elif is_py3: + utf8_string = 'Smörgås'.encode('utf-8') + else: + raise EnvironmentError('Flesh out this test for your environment.') requests.post('http://www.google.com/', data=utf8_string) + def test_unicode_error(self): - url = u'http://blip.fm/~1abvfu' + url = 'http://blip.fm/~1abvfu' requests.get(url) @@ -59,6 +71,42 @@ class RequestsTestSuite(unittest.TestCase): r = requests.head(url, allow_redirects=True) self.assertEqual(r.status_code, 200) + def test_unicode_redirect(self): + '''This url redirects to a location that has a nonstandard + character in it, that breaks requests in python2.7 + + After some research, the cause was identified as an unintended + sideeffect of overriding of str with unicode. + + In the case that the redirected url is actually a malformed + "bytes" object, i.e. a string with character c where + ord(c) > 127, + then unicode(url) breaks. + ''' + r = requests.get('http://www.marketwire.com/mw/release.' + + 'do?id=1628202&sourceType=3') + assert r.ok + + def test_unicode_url_outright(self): + '''This url visits in my browser''' + r = requests.get('http://www.marketwire.com/press-release/' + + 'jp-morgan-behauptet-sich-der-spitze-euro' + + 'p%C3%A4ischer-anleihe-analysten-laut-umf' + + 'rageergebnissen-1628202.htm') + assert r.ok + + def test_redirect_encoding(self): + '''This url redirects to + http://www.dealipedia.com/deal_view_investment.php?r=20012''' + + r = requests.get('http://feedproxy.google.com/~r/Dealipedia' + + 'News/~3/BQtUJRJeZlo/deal_view_investment.' + + 'php') + assert r.ok + + + + if __name__ == '__main__': unittest.main() -- 2.7.4