if self._read_fut is not None:
self._read_fut.cancel()
- def _fatal_error(self, exc):
+ def _fatal_error(self, exc, message='Fatal error on pipe transport'):
if not isinstance(exc, (BrokenPipeError, ConnectionResetError)):
self._loop.call_exception_handler({
- 'message': 'Fatal transport error',
+ 'message': message,
'exception': exc,
'transport': self,
'protocol': self._protocol,
self._read_fut = self._loop._proactor.recv(self._sock, 4096)
except ConnectionAbortedError as exc:
if not self._closing:
- self._fatal_error(exc)
+ self._fatal_error(exc, 'Fatal read error on pipe transport')
except ConnectionResetError as exc:
self._force_close(exc)
except OSError as exc:
- self._fatal_error(exc)
+ self._fatal_error(exc, 'Fatal read error on pipe transport')
except futures.CancelledError:
if not self._closing:
raise
except ConnectionResetError as exc:
self._force_close(exc)
except OSError as exc:
- self._fatal_error(exc)
+ self._fatal_error(exc, 'Fatal write error on pipe transport')
def can_write_eof(self):
return True
self._conn_lost += 1
self._loop.call_soon(self._call_connection_lost, None)
- def _fatal_error(self, exc):
+ def _fatal_error(self, exc, message='Fatal error on transport'):
# Should be called from exception handler only.
if not isinstance(exc, (BrokenPipeError, ConnectionResetError)):
self._loop.call_exception_handler({
- 'message': 'Fatal transport error',
+ 'message': message,
'exception': exc,
'transport': self,
'protocol': self._protocol,
except (BlockingIOError, InterruptedError):
pass
except Exception as exc:
- self._fatal_error(exc)
+ self._fatal_error(exc, 'Fatal read error on socket transport')
else:
if data:
self._protocol.data_received(data)
except (BlockingIOError, InterruptedError):
pass
except Exception as exc:
- self._fatal_error(exc)
+ self._fatal_error(exc, 'Fatal write error on socket transport')
return
else:
data = data[n:]
except Exception as exc:
self._loop.remove_writer(self._sock_fd)
self._buffer.clear()
- self._fatal_error(exc)
+ self._fatal_error(exc, 'Fatal write error on socket transport')
else:
if n:
del self._buffer[:n]
self._loop.remove_reader(self._sock_fd)
self._loop.add_writer(self._sock_fd, self._write_ready)
except Exception as exc:
- self._fatal_error(exc)
+ self._fatal_error(exc, 'Fatal read error on SSL transport')
else:
if data:
self._protocol.data_received(data)
except Exception as exc:
self._loop.remove_writer(self._sock_fd)
self._buffer.clear()
- self._fatal_error(exc)
+ self._fatal_error(exc, 'Fatal write error on SSL transport')
return
if n:
except OSError as exc:
self._protocol.error_received(exc)
except Exception as exc:
- self._fatal_error(exc)
+ self._fatal_error(exc, 'Fatal read error on datagram transport')
else:
self._protocol.datagram_received(data, addr)
self._protocol.error_received(exc)
return
except Exception as exc:
- self._fatal_error(exc)
+ self._fatal_error(exc,
+ 'Fatal write error on datagram transport')
return
# Ensure that what we buffer is immutable.
self._protocol.error_received(exc)
return
except Exception as exc:
- self._fatal_error(exc)
+ self._fatal_error(exc,
+ 'Fatal write error on datagram transport')
return
self._maybe_resume_protocol() # May append to buffer.
except (BlockingIOError, InterruptedError):
pass
except OSError as exc:
- self._fatal_error(exc)
+ self._fatal_error(exc, 'Fatal read error on pipe transport')
else:
if data:
self._protocol.data_received(data)
if not self._closing:
self._close(None)
- def _fatal_error(self, exc):
+ def _fatal_error(self, exc, message='Fatal error on pipe transport'):
# should be called by exception handler only
if not (isinstance(exc, OSError) and exc.errno == errno.EIO):
self._loop.call_exception_handler({
- 'message': 'Fatal transport error',
+ 'message': message,
'exception': exc,
'transport': self,
'protocol': self._protocol,
n = 0
except Exception as exc:
self._conn_lost += 1
- self._fatal_error(exc)
+ self._fatal_error(exc, 'Fatal write error on pipe transport')
return
if n == len(data):
return
# Remove writer here, _fatal_error() doesn't it
# because _buffer is empty.
self._loop.remove_writer(self._fileno)
- self._fatal_error(exc)
+ self._fatal_error(exc, 'Fatal write error on pipe transport')
else:
if n == len(data):
self._loop.remove_writer(self._fileno)
def abort(self):
self._close(None)
- def _fatal_error(self, exc):
+ def _fatal_error(self, exc, message='Fatal error on pipe transport'):
# should be called by exception handler only
if not isinstance(exc, (BrokenPipeError, ConnectionResetError)):
self._loop.call_exception_handler({
- 'message': 'Fatal transport error',
+ 'message': message,
'exception': exc,
'transport': self,
'protocol': self._protocol,
tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
tr._fatal_error = unittest.mock.Mock()
tr._loop_reading()
- tr._fatal_error.assert_called_with(err)
+ tr._fatal_error.assert_called_with(
+ err,
+ 'Fatal read error on pipe transport')
def test_loop_reading_aborted_closing(self):
self.loop._proactor.recv.side_effect = ConnectionAbortedError()
tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
tr._fatal_error = unittest.mock.Mock()
tr._loop_reading()
- tr._fatal_error.assert_called_with(err)
+ tr._fatal_error.assert_called_with(
+ err,
+ 'Fatal read error on pipe transport')
def test_write(self):
tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
tr._fatal_error = unittest.mock.Mock()
tr._buffer = [b'da', b'ta']
tr._loop_writing()
- tr._fatal_error.assert_called_with(err)
+ tr._fatal_error.assert_called_with(
+ err,
+ 'Fatal write error on pipe transport')
tr._conn_lost = 1
tr.write(b'data')
m_exc.assert_called_with(
test_utils.MockPattern(
- 'Fatal transport error\nprotocol:.*\ntransport:.*'),
+ 'Fatal error on transport\nprotocol:.*\ntransport:.*'),
exc_info=(OSError, MOCK_ANY, MOCK_ANY))
tr._force_close.assert_called_with(exc)
transport._fatal_error = unittest.mock.Mock()
transport._read_ready()
- transport._fatal_error.assert_called_with(err)
+ transport._fatal_error.assert_called_with(
+ err,
+ 'Fatal read error on socket transport')
def test_write(self):
data = b'data'
self.loop, self.sock, self.protocol)
transport._fatal_error = unittest.mock.Mock()
transport.write(data)
- transport._fatal_error.assert_called_with(err)
+ transport._fatal_error.assert_called_with(
+ err,
+ 'Fatal write error on socket transport')
transport._conn_lost = 1
self.sock.reset_mock()
transport._fatal_error = unittest.mock.Mock()
transport._buffer.extend(b'data')
transport._write_ready()
- transport._fatal_error.assert_called_with(err)
+ transport._fatal_error.assert_called_with(
+ err,
+ 'Fatal write error on socket transport')
@unittest.mock.patch('asyncio.base_events.logger')
def test_write_ready_exception_and_close(self, m_log):
transport = self._make_one()
transport._fatal_error = unittest.mock.Mock()
transport._read_ready()
- transport._fatal_error.assert_called_with(err)
+ transport._fatal_error.assert_called_with(
+ err,
+ 'Fatal read error on SSL transport')
def test_write_ready_send(self):
self.sslsock.send.return_value = 4
transport._buffer = list_to_buffer([b'data'])
transport._fatal_error = unittest.mock.Mock()
transport._write_ready()
- transport._fatal_error.assert_called_with(err)
+ transport._fatal_error.assert_called_with(
+ err,
+ 'Fatal write error on SSL transport')
self.assertEqual(list_to_buffer(), transport._buffer)
def test_write_ready_read_wants_write(self):
transport._fatal_error = unittest.mock.Mock()
transport._read_ready()
- transport._fatal_error.assert_called_with(err)
+ transport._fatal_error.assert_called_with(
+ err,
+ 'Fatal read error on datagram transport')
def test_read_ready_oserr(self):
transport = _SelectorDatagramTransport(
transport.sendto(data, ())
self.assertTrue(transport._fatal_error.called)
- transport._fatal_error.assert_called_with(err)
+ transport._fatal_error.assert_called_with(
+ err,
+ 'Fatal write error on datagram transport')
transport._conn_lost = 1
transport._address = ('123',)
transport._buffer.append((b'data', ()))
transport._sendto_ready()
- transport._fatal_error.assert_called_with(err)
+ transport._fatal_error.assert_called_with(
+ err,
+ 'Fatal write error on datagram transport')
def test_sendto_ready_error_received(self):
self.sock.sendto.side_effect = ConnectionRefusedError
self.assertFalse(self.protocol.error_received.called)
m_exc.assert_called_with(
test_utils.MockPattern(
- 'Fatal transport error\nprotocol:.*\ntransport:.*'),
+ 'Fatal error on transport\nprotocol:.*\ntransport:.*'),
exc_info=(ConnectionRefusedError, MOCK_ANY, MOCK_ANY))
tr._close.assert_called_with(err)
m_logexc.assert_called_with(
test_utils.MockPattern(
- 'Fatal transport error\nprotocol:.*\ntransport:.*'),
+ 'Fatal read error on pipe transport\nprotocol:.*\ntransport:.*'),
exc_info=(OSError, MOCK_ANY, MOCK_ANY))
@unittest.mock.patch('os.read')
m_write.assert_called_with(5, b'data')
self.assertFalse(self.loop.writers)
self.assertEqual([], tr._buffer)
- tr._fatal_error.assert_called_with(err)
+ tr._fatal_error.assert_called_with(
+ err,
+ 'Fatal write error on pipe transport')
self.assertEqual(1, tr._conn_lost)
tr.write(b'data')
self.assertTrue(tr._closing)
m_logexc.assert_called_with(
test_utils.MockPattern(
- 'Fatal transport error\nprotocol:.*\ntransport:.*'),
+ 'Fatal write error on pipe transport\nprotocol:.*\ntransport:.*'),
exc_info=(OSError, MOCK_ANY, MOCK_ANY))
self.assertEqual(1, tr._conn_lost)
test_utils.run_briefly(self.loop)