diff --git a/requests/models.py b/requests/models.py index d8c0f3e8..20a28807 100644 --- a/requests/models.py +++ b/requests/models.py @@ -71,7 +71,14 @@ class Request(object): self.timeout = timeout #: Request URL. - self.url = url + #: Accept objects that have string representations. + try: + self.url = unicode(url) + except NameError: + # We're on Python 3. + self.url = str(url) + except UnicodeDecodeError: + self.url = url #: Dictionary of HTTP Headers to attach to the :class:`Request `. self.headers = dict(headers or []) diff --git a/tests/test_requests.py b/tests/test_requests.py index dd08b2af..f7803ba1 100755 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -996,5 +996,23 @@ class RequestsTestSuite(TestSetup, TestBaseMixin, unittest.TestCase): first_line = next(req.response.iter_lines()) self.assertTrue(first_line.strip().decode('utf-8').startswith('{')) + def test_accept_objects_with_string_representations_as_urls(self): + """Test that URLs can be set to objects with string representations, + e.g. for use with furl.""" + class URL(): + def __unicode__(self): + # Can't have unicode literals in Python3, so avoid them. + # TODO: fixup when moving to Python 3.3 + if (sys.version_info[0] == 2): + return 'http://httpbin.org/get'.decode('utf-8') + else: + return 'http://httpbin.org/get' + + def __str__(self): + return 'http://httpbin.org/get' + + r = get(URL()) + self.assertEqual(r.status_code, 200) + if __name__ == '__main__': unittest.main()