diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index 58ca2a5..1492499 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -1407,15 +1407,18 @@ class RequestTests(unittest.TestCase): Request = urllib.request.Request request = Request("http://www.python.org") self.assertEqual(request.get_method(), 'GET') - request = Request("http://www.python.org", {}) + request = Request("http://www.python.org", None) + self.assertEqual(request.get_method(), 'GET') + request = Request("http://www.python.org", b'') self.assertEqual(request.get_method(), 'POST') + def test_with_method_arg(self): Request = urllib.request.Request request = Request("http://www.python.org", method='HEAD') self.assertEqual(request.method, 'HEAD') self.assertEqual(request.get_method(), 'HEAD') - request = Request("http://www.python.org", {}, method='HEAD') + request = Request("http://www.python.org", None, method='HEAD') self.assertEqual(request.method, 'HEAD') self.assertEqual(request.get_method(), 'HEAD') request = Request("http://www.python.org", method='GET') @@ -1423,6 +1426,14 @@ class RequestTests(unittest.TestCase): request.method = 'HEAD' self.assertEqual(request.get_method(), 'HEAD') + def test_with_invalid_param_type(self): + Request = urllib.request.Request + with self.assertRaisesRegex(TypeError, "url should be of type str"): + request = Request(b"http://www.python.org") + with self.assertRaisesRegex(TypeError, "POST data should be bytes or an iterable of bytes. It cannot be of type str."): + request = Request("http://www.python.org", urllib.parse.urlencode({})) + with self.assertRaisesRegex(TypeError,"POST data should be bytes or an iterable of bytes. It cannot be of type dict."): + request = Request("http://www.python.org", {}) class URL2PathNameTests(unittest.TestCase): diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index e6abf34..9745897 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -353,6 +353,8 @@ class Request: @full_url.setter def full_url(self, url): + if not isinstance(url, str): + raise TypeError("url should be of type str") # unwrap('') --> 'type://host/path' self._full_url = unwrap(url) self._full_url, self.fragment = splittag(self._full_url) @@ -370,6 +372,11 @@ class Request: @data.setter def data(self, data): + if isinstance(data, str): + raise TypeError("POST data should be bytes or an iterable of bytes. It cannot be of type str.") + if isinstance(data, dict): + raise TypeError("POST data should be bytes or an iterable of bytes. It cannot be of type dict.") + if data != self._data: self._data = data # issue 16464