diff --git a/aiohttp/web_request.py b/aiohttp/web_request.py index 6c1b7c43895..dbcffa951a9 100644 --- a/aiohttp/web_request.py +++ b/aiohttp/web_request.py @@ -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, @@ -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: @@ -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' @@ -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: diff --git a/tests/test_web_request.py b/tests/test_web_request.py index 27e83540f48..421ffda908c 100644 --- a/tests/test_web_request.py +++ b/tests/test_web_request.py @@ -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():