Merge branch '400-header_expand-unicode' of https://github.com/acdha/requests into...
authorKenneth Reitz <me@kennethreitz.com>
Wed, 15 Feb 2012 06:25:29 +0000 (01:25 -0500)
committerKenneth Reitz <me@kennethreitz.com>
Wed, 15 Feb 2012 06:25:29 +0000 (01:25 -0500)
1  2 
requests/utils.py
test_requests.py

Simple merge
index 0b5edcc,59069f3..909f5ff
mode 100644,100755..100755
@@@ -111,79 -111,17 +111,84 @@@ class RequestsTestSuite(TestSetup, unit
          r = get(httpbin('get') + '?test=true', params={'q': 'test'}, headers=heads)
          self.assertEqual(r.status_code, 200)
  
-     def test_session_with_unicode_headers(self):
-         heads = { u'User-Agent': u'\u30cd\u30c3\u30c8\u30ef\u30fc\u30af' }
+     def test_unicode_headers(self):
+         # Simply calling requests with a unicode instance should simply work
+         # when the characters are all representable using latin-1:
+         heads = { u'User-Agent': u'Requests Test Suite' }
          requests.get(url=httpbin('get'), headers=heads)
  
+         # Characters outside latin-1 should raise an exception:
+         heads = { u'User-Agent': u'\u30cd\u30c3\u30c8\u30ef\u30fc\u30af' }
+         self.assertRaises(UnicodeEncodeError, requests.get,
+                           url=httpbin('get'), headers=heads)
  
 +    def test_session_with_escaped_url(self):
 +        # Test a URL that contains percent-escaped characters
 +        # This URL should not be modified (double-escaped)
 +        # Tests:
 +        # - Quoted illegal characters ("%20" (' '), "%3C" ('<'), "%3E" ('>'))
 +        # - Quoted reserved characters ("%25" ('%'), "%23" ('#'), "%2F" ('/'))
 +        # - Quoted non-ASCII characters ("%C3%98", "%C3%A5")
 +        path_fully_escaped = '%3Ca%25b%23c%2Fd%3E/%C3%98%20%C3%A5'
 +        url = httpbin('get/' + path_fully_escaped)
 +        response = get(url)
 +        self.assertEqual(response.url, httpbin('get/' + path_fully_escaped))
 +
 +        # Test that illegal characters in a path get properly percent-escaped
 +        # Tests:
 +        # - Bare illegal characters (space, '<')
 +        # - Bare non-ASCII characters ('\u00d8')
 +        path = u'<a%25b%23c%2Fd%3E/\u00d8 %C3%A5'
 +        url = httpbin('get/' + path)
 +        response = get(url)
 +        self.assertEqual(response.url, httpbin('get/' + path_fully_escaped))
 +
 +        # Test that reserved characters in a path do not get percent-escaped
 +        # Tests:
 +        # - All reserved characters (RFC 3986), except '?', '#', '[' and ']',
 +        #   which are not allowed in the path, and ';' which delimits
 +        #   parameters.
 +        #   All such characters must be allowed bare in path, and must not be
 +        #   encoded.
 +        # - Special unreserved characters (RFC 3986), which should not be
 +        #   encoded (even though it wouldn't hurt).
 +        path_reserved = '!$&\'()*+,/:=@-._~'
 +        url = httpbin('get/' + path_reserved)
 +        response = get(url)
 +        self.assertEqual(response.url, httpbin('get/' + path_reserved))
 +
 +        # Test that percent-encoded unreserved characters in a path get
 +        # normalised to their un-encoded forms.
 +        path_unreserved = 'ABCDwxyz1234-._~'
 +        path_unreserved_escaped = '%41%42%43%44%77%78%79%7A%31%32%33%34%2D%2E%5F%7E'
 +        url = httpbin('get/' + path_unreserved_escaped)
 +        response = get(url)
 +        self.assertEqual(response.url, httpbin('get/' + path_unreserved))
 +
 +        # Re-run all of the same tests on the query part of the URI
 +        query_fully_escaped = '%3Ca%25b%23c%2Fd%3E=%C3%98%20%C3%A5'
 +        url = httpbin('get/?' + query_fully_escaped)
 +        response = get(url)
 +        self.assertEqual(response.url, httpbin('get/?' + query_fully_escaped))
 +
 +        query = u'<a%25b%23c%2Fd%3E=\u00d8 %C3%A5'
 +        url = httpbin('get/?' + query)
 +        response = get(url)
 +        self.assertEqual(response.url, httpbin('get/?' + query_fully_escaped))
 +
 +        # The legal characters in query happens to be the same as in path
 +        query_reserved = '!$&\'()*+,/:=@-._~'
 +        url = httpbin('get/?' + query_reserved)
 +        response = get(url)
 +        self.assertEqual(response.url, httpbin('get/?' + query_reserved))
 +
 +        query_unreserved = 'ABCDwxyz=1234-._~'
 +        query_unreserved_escaped = '%41%42%43%44%77%78%79%7A=%31%32%33%34%2D%2E%5F%7E'
 +        url = httpbin('get/?' + query_unreserved_escaped)
 +        response = get(url)
 +        self.assertEqual(response.url, httpbin('get/?' + query_unreserved))
 +
 +
      def test_user_agent_transfers(self):
          """Issue XX"""