Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add test accessing request.url when transport is closed #3177

Merged
merged 4 commits into from
Sep 2, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 10 additions & 8 deletions aiohttp/web_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,8 @@ class BaseRequest(collections.MutableMapping, HeadersMixin):
ATTRS = HeadersMixin.ATTRS | frozenset([
'_message', '_protocol', '_payload_writer', '_payload', '_headers',
'_method', '_version', '_rel_url', '_post', '_read_bytes',
'_state', '_cache', '_task', '_client_max_size', '_loop'])
'_state', '_cache', '_task', '_client_max_size', '_loop',
'_transport_sslcontext', '_transport_peername'])

def __init__(self, message, payload, protocol, payload_writer, task,
loop,
Expand All @@ -105,6 +106,10 @@ def __init__(self, message, payload, protocol, payload_writer, task,
self._client_max_size = client_max_size
self._loop = loop

transport = self._protocol.transport
self._transport_sslcontext = transport.get_extra_info('sslcontext')
self._transport_peername = transport.get_extra_info('peername')

if scheme is not None:
self._cache['scheme'] = scheme
if host is not None:
Expand Down Expand Up @@ -292,7 +297,7 @@ def scheme(self) -> str:

'http' or 'https'.
"""
if self.transport.get_extra_info('sslcontext'):
if self._transport_sslcontext:
return 'https'
else:
return 'http'
Expand Down Expand Up @@ -338,13 +343,10 @@ def remote(self) -> Optional[str]:
- overridden value by .clone(remote=new_remote) call.
- peername of opened socket
"""
if self.transport is None:
return None
peername = self.transport.get_extra_info('peername')
if isinstance(peername, (list, tuple)):
return peername[0]
if isinstance(self._transport_peername, (list, tuple)):
return self._transport_peername[0]
else:
return peername
return self._transport_peername

@reify
def url(self) -> URL:
Expand Down
16 changes: 15 additions & 1 deletion tests/test_web_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -631,9 +631,23 @@ def test_request_custom_attr():


def test_remote_with_closed_transport():
transp = mock.Mock()
transp.get_extra_info.return_value = ('10.10.10.10', 1234)
req = make_mocked_request('GET', '/', transport=transp)
req._protocol = None
assert req.remote == '10.10.10.10'


def test_url_http_with_closed_transport():
req = make_mocked_request('GET', '/')
req._protocol = None
assert req.remote is None
assert str(req.url).startswith('http://')


def test_url_https_with_closed_transport():
req = make_mocked_request('GET', '/', sslcontext=True)
req._protocol = None
assert str(req.url).startswith('https://')


def test_eq():
Expand Down