don't prepare URLs for oddball schemes
authorJayson Vantuyl <jayson@aggressive.ly>
Wed, 30 Oct 2013 08:35:54 +0000 (01:35 -0700)
committerJayson Vantuyl <jayson@aggressive.ly>
Wed, 30 Oct 2013 17:04:43 +0000 (10:04 -0700)
requests/models.py
requests/packages/urllib3/util.py
test_requests.py

index a67868e44b286fe5f06a48c6237ccbe8a801c29a..a9ccaf7b7b996a43c0725ab828291534a282f2a5 100644 (file)
@@ -327,6 +327,11 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):
             raise MissingSchema("Invalid URL {0!r}: No schema supplied. "
                                 "Perhaps you meant http://{0}?".format(url))
 
+        # Don't do any URL preparation for oddball schemes
+        if scheme.lower() not in ('http', 'https'):
+            self.url = url
+            return
+
         if not host:
             raise InvalidURL("Invalid URL %r: No host supplied" % url)
 
index cf934d4246f01ffc22a7398da4699a9ced239d9e..19b7c7e8ba134714a34552bdc4c21bb0711edd9e 100644 (file)
@@ -365,6 +365,8 @@ def parse_url(url):
     # Scheme
     if '://' in url:
         scheme, url = url.split('://', 1)
+    elif ':' in url:
+        scheme, url = url.split(':', 1)
 
     # Find the earliest Authority Terminator
     # (http://tools.ietf.org/html/rfc3986#section-3.2)
index a593db30a26a061a70a4537042b5debf94c3ee2e..a67be6247b2fcfa54ed44e89b4ef2eb327420d7e 100755 (executable)
@@ -678,6 +678,14 @@ class RequestsTestCase(unittest.TestCase):
 
         assert p.headers['Content-Length'] == length
 
+    def test_oddball_schemes_dont_check_URLs(self):
+        r1 = requests.Request('GET', 'data:image/gif;base64,R0lGODlhAQABAHAAACH5BAUAAAAALAAAAAABAAEAAAICRAEAOw==')
+        r1.prepare()
+        r2 = requests.Request('GET', 'file:///etc/passwd')
+        r2.prepare()
+        r3 = requests.Request('GET', 'magnet:?xt=urn:btih:be08f00302bc2d1d3cfa3af02024fa647a271431')
+        r3.prepare()
+
 class TestContentEncodingDetection(unittest.TestCase):
 
     def test_none(self):