diff --git a/scrapy/http/request/__init__.py b/scrapy/http/request/__init__.py index c2649c967..1b14e2068 100644 --- a/scrapy/http/request/__init__.py +++ b/scrapy/http/request/__init__.py @@ -54,8 +54,7 @@ class Request(object_ref): if self.encoding is None: raise TypeError('Cannot convert unicode url - %s has no encoding' % type(self).__name__) - unicode_url = url if isinstance(url, unicode) else url.decode(self.encoding) - self._url = safe_url_string(unicode_url, self.encoding) + self._set_url(url.encode(self.encoding)) else: raise TypeError('Request url must be str or unicode, got %s:' % type(url).__name__) if ':' not in self._url: diff --git a/scrapy/tests/test_http_request.py b/scrapy/tests/test_http_request.py index f18823235..737849067 100644 --- a/scrapy/tests/test_http_request.py +++ b/scrapy/tests/test_http_request.py @@ -108,8 +108,12 @@ class RequestTest(unittest.TestCase): self.assertEqual(r4.body, "Price: \xa3100") def test_ajax_url(self): + # ascii url r = self.request_class(url="http://www.example.com/ajax.html#!key=value") self.assertEqual(r.url, "http://www.example.com/ajax.html?_escaped_fragment_=key=value") + # unicode url + r = self.request_class(url=u"http://www.example.com/ajax.html#!key=value") + self.assertEqual(r.url, "http://www.example.com/ajax.html?_escaped_fragment_=key=value") def test_copy(self): """Test Request copy"""