Message182642
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} |
|
Date |
User |
Action |
Args |
2013-02-22 05:56:42 | demian.brecht | set | recipients:
+ demian.brecht |
2013-02-22 05:56:42 | demian.brecht | set | messageid: <1361512602.9.0.97298415685.issue17272@psf.upfronthosting.co.za> |
2013-02-22 05:56:42 | demian.brecht | link | issue17272 messages |
2013-02-22 05:56:42 | demian.brecht | create | |
|