diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py index b3659f442e4..dbd1c60ec24 100644 --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -1466,16 +1466,25 @@ def test_HTTPError_interface(self): self.assertEqual(str(err), expected_errmsg) class RequestTests(unittest.TestCase): + class PutRequest(Request): + method='PUT' def setUp(self): self.get = Request("http://www.python.org/~jeremy/") self.post = Request("http://www.python.org/~jeremy/", "data", headers={"X-Test": "test"}) + self.head = Request("http://www.python.org/~jeremy/", method='HEAD') + self.put = self.PutRequest("http://www.python.org/~jeremy/") + self.force_post = self.PutRequest("http://www.python.org/~jeremy/", + method="POST") def test_method(self): self.assertEqual("POST", self.post.get_method()) self.assertEqual("GET", self.get.get_method()) + self.assertEqual("HEAD", self.head.get_method()) + self.assertEqual("PUT", self.put.get_method()) + self.assertEqual("POST", self.force_post.get_method()) def test_data(self): self.assertFalse(self.get.data) diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index 4765a942886..bceb3297c8e 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -271,7 +271,8 @@ def __init__(self, url, data=None, headers={}, origin_req_host = request_host(self) self.origin_req_host = origin_req_host self.unverifiable = unverifiable - self.method = method + if method: + self.method = method @property def full_url(self): @@ -320,12 +321,8 @@ def _parse(self): def get_method(self): """Return a string indicating the HTTP request method.""" - if self.method is not None: - return self.method - elif self.data is not None: - return "POST" - else: - return "GET" + default_method = "POST" if self.data is not None else "GET" + return getattr(self, 'method', default_method) def get_full_url(self): return self.full_url diff --git a/Misc/NEWS b/Misc/NEWS index 456307a25cf..79ab3a7f172 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ Core and Builtins Library ------- +- Issue #18978: ``urllib.request.Request`` now allows the method to be + indicated on the class and no longer sets it to None in ``__init__``. + - Issue #18626: the inspect module now offers a basic command line introspection interface (Initial patch by Claudiu Popa)