New submission from Demian Brecht: When assigning a value to an already instantiated Request object's full_url, unexpected results are found as a consequence in the attributes selector, type and fragment. Selector, type and fragment are only assigned to during instantiation. Unless you know to call Request._parse() after assignment to Request.full_url, the other attributes will not be reassigned new values.
The attached patch changes full_url to be a @property, essentially moving what was going on in the constructor into the property method(s). All tests pass. I ran into this issue when working on an OAuth 2.0 client library when attempting to mutate an already instantiated Request object, injecting the access_token into the query params. Sandboxed code to repro the issue below: In [1]: from urllib.request import Request In [2]: r = Request('https://example.com?foo=bar#baz') # as expected In [4]: r.__dict__ Out[4]: {'_data': None, '_tunnel_host': None, 'fragment': 'baz', 'full_url': 'https://example.com?foo=bar', 'headers': {}, 'host': 'example.com', 'method': None, 'origin_req_host': 'example.com', 'selector': '/?foo=bar', 'type': 'https', 'unredirected_hdrs': {}, 'unverifiable': False} In [5]: r.full_url = 'https://example.com?foo=bar&access_token=token_value#baz' # unexpected results in selector In [6]: r.__dict__ Out[6]: {'_data': None, '_tunnel_host': None, 'fragment': 'baz', 'full_url': 'https://example.com?foo=bar&access_token=token_value#baz', 'headers': {}, 'host': 'example.com', 'method': None, 'origin_req_host': 'example.com', 'selector': '/?foo=bar', 'type': 'https', 'unredirected_hdrs': {}, 'unverifiable': False} In [7]: Request('https://example.com?foo=bar&access_token=token_value#baz') Out[7]: <urllib.request.Request at 0x10ef6ce90> # these results should match that of the full_url setter In [8]: Request('https://example.com?foo=bar&access_token=token_value#baz').__dict__ Out[8]: {'_data': None, '_tunnel_host': None, 'fragment': 'baz', 'full_url': 'https://example.com?foo=bar&access_token=token_value', 'headers': {}, 'host': 'example.com', 'method': None, 'origin_req_host': 'example.com', 'selector': '/?foo=bar&access_token=token_value', 'type': 'https', 'unredirected_hdrs': {}, 'unverifiable': False} ---------- components: Library (Lib) files: request.patch keywords: patch messages: 182642 nosy: dbrecht priority: normal severity: normal status: open title: request.full_url: unexpected results on assignment versions: Python 3.4 Added file: http://bugs.python.org/file29156/request.patch _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue17272> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com