|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510 |
- # Copyright (c) Twisted Matrix Laboratories.
- # See LICENSE for details.
-
- """
- Exceptions and errors for use in twisted.internet modules.
- """
-
-
- import socket
-
- from incremental import Version
-
- from twisted.python import deprecate
-
-
- class BindError(Exception):
- __doc__ = MESSAGE = "An error occurred binding to an interface"
-
- def __str__(self) -> str:
- s = self.MESSAGE
- if self.args:
- s = "{}: {}".format(s, " ".join(self.args))
- s = "%s." % s
- return s
-
-
- class CannotListenError(BindError):
- """
- This gets raised by a call to startListening, when the object cannotstart
- listening.
-
- @ivar interface: the interface I tried to listen on
- @ivar port: the port I tried to listen on
- @ivar socketError: the exception I got when I tried to listen
- @type socketError: L{socket.error}
- """
-
- def __init__(self, interface, port, socketError):
- BindError.__init__(self, interface, port, socketError)
- self.interface = interface
- self.port = port
- self.socketError = socketError
-
- def __str__(self) -> str:
- iface = self.interface or "any"
- return "Couldn't listen on {}:{}: {}.".format(
- iface, self.port, self.socketError
- )
-
-
- class MulticastJoinError(Exception):
- """
- An attempt to join a multicast group failed.
- """
-
-
- class MessageLengthError(Exception):
- __doc__ = MESSAGE = "Message is too long to send"
-
- def __str__(self) -> str:
- s = self.MESSAGE
- if self.args:
- s = "{}: {}".format(s, " ".join(self.args))
- s = "%s." % s
- return s
-
-
- class DNSLookupError(IOError):
- __doc__ = MESSAGE = "DNS lookup failed"
-
- def __str__(self) -> str:
- s = self.MESSAGE
- if self.args:
- s = "{}: {}".format(s, " ".join(self.args))
- s = "%s." % s
- return s
-
-
- class ConnectInProgressError(Exception):
- """A connect operation was started and isn't done yet."""
-
-
- # connection errors
-
-
- class ConnectError(Exception):
- __doc__ = MESSAGE = "An error occurred while connecting"
-
- def __init__(self, osError=None, string=""):
- self.osError = osError
- Exception.__init__(self, string)
-
- def __str__(self) -> str:
- s = self.MESSAGE
- if self.osError:
- s = f"{s}: {self.osError}"
- if self.args[0]:
- s = f"{s}: {self.args[0]}"
- s = "%s." % s
- return s
-
-
- class ConnectBindError(ConnectError):
- __doc__ = MESSAGE = "Couldn't bind"
-
-
- class UnknownHostError(ConnectError):
- __doc__ = MESSAGE = "Hostname couldn't be looked up"
-
-
- class NoRouteError(ConnectError):
- __doc__ = MESSAGE = "No route to host"
-
-
- class ConnectionRefusedError(ConnectError):
- __doc__ = MESSAGE = "Connection was refused by other side"
-
-
- class TCPTimedOutError(ConnectError):
- __doc__ = MESSAGE = "TCP connection timed out"
-
-
- class BadFileError(ConnectError):
- __doc__ = MESSAGE = "File used for UNIX socket is no good"
-
-
- class ServiceNameUnknownError(ConnectError):
- __doc__ = MESSAGE = "Service name given as port is unknown"
-
-
- class UserError(ConnectError):
- __doc__ = MESSAGE = "User aborted connection"
-
-
- class TimeoutError(UserError):
- __doc__ = MESSAGE = "User timeout caused connection failure"
-
-
- class SSLError(ConnectError):
- __doc__ = MESSAGE = "An SSL error occurred"
-
-
- class VerifyError(Exception):
- __doc__ = MESSAGE = "Could not verify something that was supposed to be signed."
-
-
- class PeerVerifyError(VerifyError):
- __doc__ = MESSAGE = "The peer rejected our verify error."
-
-
- class CertificateError(Exception):
- __doc__ = MESSAGE = "We did not find a certificate where we expected to find one."
-
-
- try:
- import errno
-
- errnoMapping = {
- errno.ENETUNREACH: NoRouteError,
- errno.ECONNREFUSED: ConnectionRefusedError,
- errno.ETIMEDOUT: TCPTimedOutError,
- }
- if hasattr(errno, "WSAECONNREFUSED"):
- errnoMapping[errno.WSAECONNREFUSED] = ConnectionRefusedError # type: ignore[attr-defined]
- errnoMapping[errno.WSAENETUNREACH] = NoRouteError # type: ignore[attr-defined]
- except ImportError:
- errnoMapping = {}
-
-
- def getConnectError(e):
- """Given a socket exception, return connection error."""
- if isinstance(e, Exception):
- args = e.args
- else:
- args = e
- try:
- number, string = args
- except ValueError:
- return ConnectError(string=e)
-
- if hasattr(socket, "gaierror") and isinstance(e, socket.gaierror):
- # Only works in 2.2 in newer. Really that means always; #5978 covers
- # this and other weirdnesses in this function.
- klass = UnknownHostError
- else:
- klass = errnoMapping.get(number, ConnectError)
- return klass(number, string)
-
-
- class ConnectionClosed(Exception):
- """
- Connection was closed, whether cleanly or non-cleanly.
- """
-
-
- class ConnectionLost(ConnectionClosed):
- __doc__ = MESSAGE = """
- Connection to the other side was lost in a non-clean fashion
- """
-
- def __str__(self) -> str:
- s = self.MESSAGE.strip().splitlines()[:1]
- if self.args:
- s.append(": ")
- s.append(" ".join(self.args))
- s.append(".")
- return "".join(s)
-
-
- class ConnectionAborted(ConnectionLost):
- """
- Connection was aborted locally, using
- L{twisted.internet.interfaces.ITCPTransport.abortConnection}.
-
- @since: 11.1
- """
-
- MESSAGE = "Connection was aborted locally using " "ITCPTransport.abortConnection"
-
-
- class ConnectionDone(ConnectionClosed):
- __doc__ = MESSAGE = "Connection was closed cleanly"
-
- def __str__(self) -> str:
- s = self.MESSAGE
- if self.args:
- s = "{}: {}".format(s, " ".join(self.args))
- s = "%s." % s
- return s
-
-
- class FileDescriptorOverrun(ConnectionLost):
- """
- A mis-use of L{IUNIXTransport.sendFileDescriptor} caused the connection to
- be closed.
-
- Each file descriptor sent using C{sendFileDescriptor} must be associated
- with at least one byte sent using L{ITransport.write}. If at any point
- fewer bytes have been written than file descriptors have been sent, the
- connection is closed with this exception.
- """
-
- MESSAGE = (
- "A mis-use of IUNIXTransport.sendFileDescriptor caused "
- "the connection to be closed."
- )
-
-
- class ConnectionFdescWentAway(ConnectionLost):
- __doc__ = MESSAGE = "Uh" # TODO
-
-
- class AlreadyCalled(ValueError):
- __doc__ = MESSAGE = "Tried to cancel an already-called event"
-
- def __str__(self) -> str:
- s = self.MESSAGE
- if self.args:
- s = "{}: {}".format(s, " ".join(self.args))
- s = "%s." % s
- return s
-
-
- class AlreadyCancelled(ValueError):
- __doc__ = MESSAGE = "Tried to cancel an already-cancelled event"
-
- def __str__(self) -> str:
- s = self.MESSAGE
- if self.args:
- s = "{}: {}".format(s, " ".join(self.args))
- s = "%s." % s
- return s
-
-
- class PotentialZombieWarning(Warning):
- """
- Emitted when L{IReactorProcess.spawnProcess} is called in a way which may
- result in termination of the created child process not being reported.
-
- Deprecated in Twisted 10.0.
- """
-
- MESSAGE = (
- "spawnProcess called, but the SIGCHLD handler is not "
- "installed. This probably means you have not yet "
- "called reactor.run, or called "
- "reactor.run(installSignalHandler=0). You will probably "
- "never see this process finish, and it may become a "
- "zombie process."
- )
-
-
- deprecate.deprecatedModuleAttribute(
- Version("Twisted", 10, 0, 0),
- "There is no longer any potential for zombie process.",
- __name__,
- "PotentialZombieWarning",
- )
-
-
- class ProcessDone(ConnectionDone):
- __doc__ = MESSAGE = "A process has ended without apparent errors"
-
- def __init__(self, status):
- Exception.__init__(self, "process finished with exit code 0")
- self.exitCode = 0
- self.signal = None
- self.status = status
-
-
- class ProcessTerminated(ConnectionLost):
- __doc__ = MESSAGE = """
- A process has ended with a probable error condition
-
- @ivar exitCode: See L{__init__}
- @ivar signal: See L{__init__}
- @ivar status: See L{__init__}
- """
-
- def __init__(self, exitCode=None, signal=None, status=None):
- """
- @param exitCode: The exit status of the process. This is roughly like
- the value you might pass to L{os._exit}. This is L{None} if the
- process exited due to a signal.
- @type exitCode: L{int} or L{None}
-
- @param signal: The exit signal of the process. This is L{None} if the
- process did not exit due to a signal.
- @type signal: L{int} or L{None}
-
- @param status: The exit code of the process. This is a platform
- specific combination of the exit code and the exit signal. See
- L{os.WIFEXITED} and related functions.
- @type status: L{int}
- """
- self.exitCode = exitCode
- self.signal = signal
- self.status = status
- s = "process ended"
- if exitCode is not None:
- s = s + " with exit code %s" % exitCode
- if signal is not None:
- s = s + " by signal %s" % signal
- Exception.__init__(self, s)
-
-
- class ProcessExitedAlready(Exception):
- """
- The process has already exited and the operation requested can no longer
- be performed.
- """
-
-
- class NotConnectingError(RuntimeError):
- __doc__ = (
- MESSAGE
- ) = "The Connector was not connecting when it was asked to stop connecting"
-
- def __str__(self) -> str:
- s = self.MESSAGE
- if self.args:
- s = "{}: {}".format(s, " ".join(self.args))
- s = "%s." % s
- return s
-
-
- class NotListeningError(RuntimeError):
- __doc__ = MESSAGE = "The Port was not listening when it was asked to stop listening"
-
- def __str__(self) -> str:
- s = self.MESSAGE
- if self.args:
- s = "{}: {}".format(s, " ".join(self.args))
- s = "%s." % s
- return s
-
-
- class ReactorNotRunning(RuntimeError):
- """
- Error raised when trying to stop a reactor which is not running.
- """
-
-
- class ReactorNotRestartable(RuntimeError):
- """
- Error raised when trying to run a reactor which was stopped.
- """
-
-
- class ReactorAlreadyRunning(RuntimeError):
- """
- Error raised when trying to start the reactor multiple times.
- """
-
-
- class ReactorAlreadyInstalledError(AssertionError):
- """
- Could not install reactor because one is already installed.
- """
-
-
- class ConnectingCancelledError(Exception):
- """
- An C{Exception} that will be raised when an L{IStreamClientEndpoint} is
- cancelled before it connects.
-
- @ivar address: The L{IAddress} that is the destination of the
- cancelled L{IStreamClientEndpoint}.
- """
-
- def __init__(self, address):
- """
- @param address: The L{IAddress} that is the destination of the
- L{IStreamClientEndpoint} that was cancelled.
- """
- Exception.__init__(self, address)
- self.address = address
-
-
- class NoProtocol(Exception):
- """
- An C{Exception} that will be raised when the factory given to a
- L{IStreamClientEndpoint} returns L{None} from C{buildProtocol}.
- """
-
-
- class UnsupportedAddressFamily(Exception):
- """
- An attempt was made to use a socket with an address family (eg I{AF_INET},
- I{AF_INET6}, etc) which is not supported by the reactor.
- """
-
-
- class UnsupportedSocketType(Exception):
- """
- An attempt was made to use a socket of a type (eg I{SOCK_STREAM},
- I{SOCK_DGRAM}, etc) which is not supported by the reactor.
- """
-
-
- class AlreadyListened(Exception):
- """
- An attempt was made to listen on a file descriptor which can only be
- listened on once.
- """
-
-
- class InvalidAddressError(ValueError):
- """
- An invalid address was specified (i.e. neither IPv4 or IPv6, or expected
- one and got the other).
-
- @ivar address: See L{__init__}
- @ivar message: See L{__init__}
- """
-
- def __init__(self, address, message):
- """
- @param address: The address that was provided.
- @type address: L{bytes}
- @param message: A native string of additional information provided by
- the calling context.
- @type address: L{str}
- """
- self.address = address
- self.message = message
-
-
- __all__ = [
- "BindError",
- "CannotListenError",
- "MulticastJoinError",
- "MessageLengthError",
- "DNSLookupError",
- "ConnectInProgressError",
- "ConnectError",
- "ConnectBindError",
- "UnknownHostError",
- "NoRouteError",
- "ConnectionRefusedError",
- "TCPTimedOutError",
- "BadFileError",
- "ServiceNameUnknownError",
- "UserError",
- "TimeoutError",
- "SSLError",
- "VerifyError",
- "PeerVerifyError",
- "CertificateError",
- "getConnectError",
- "ConnectionClosed",
- "ConnectionLost",
- "ConnectionDone",
- "ConnectionFdescWentAway",
- "AlreadyCalled",
- "AlreadyCancelled",
- "PotentialZombieWarning",
- "ProcessDone",
- "ProcessTerminated",
- "ProcessExitedAlready",
- "NotConnectingError",
- "NotListeningError",
- "ReactorNotRunning",
- "ReactorAlreadyRunning",
- "ReactorAlreadyInstalledError",
- "ConnectingCancelledError",
- "UnsupportedAddressFamily",
- "UnsupportedSocketType",
- "InvalidAddressError",
- ]
|