merge conflict and fixes for python3
authorKenneth Reitz <me@kennethreitz.com>
Fri, 9 Mar 2012 16:43:12 +0000 (08:43 -0800)
committerKenneth Reitz <me@kennethreitz.com>
Fri, 9 Mar 2012 16:43:12 +0000 (08:43 -0800)
AUTHORS.rst
requests/models.py
tests/test_requests_ext.py

index 19729a1..0e6e7ef 100644 (file)
@@ -86,3 +86,4 @@ Patches and Suggestions
 - Honza Javorek
 - Brendan Maguire <maguire.brendan@gmail.com>
 - Chris Dary
+- Danver Braganza <danverbraganza@gmail.com>
index 4f05601..a354eb2 100644 (file)
@@ -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)
index 2102a5e..1e4d89b 100644 (file)
@@ -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()