diff --git a/sjrpc/core/exceptions.py b/sjrpc/core/exceptions.py index 5b2aa538eb5d5b05027729fa9117244943a886e2..97e25fb21f30c4d994b8854a843ffb1c04730632 100644 --- a/sjrpc/core/exceptions.py +++ b/sjrpc/core/exceptions.py @@ -31,3 +31,11 @@ class NoFreeLabelError(Exception): Exception raised when no more free labels are available for protocol allocation. ''' + + +class FallbackModeEnabledError(Exception): + + ''' + Exception raised when a feature which is not compatible with fallback mode + is used. + ''' diff --git a/sjrpc/core/rpcconnection.py b/sjrpc/core/rpcconnection.py index 17f2a115d1a05443695152600076600a84c935c1..2ea587e6e9bea006c76af5066171a761ef80f9cd 100644 --- a/sjrpc/core/rpcconnection.py +++ b/sjrpc/core/rpcconnection.py @@ -12,7 +12,8 @@ import socket import logging from sjrpc.core.protocols import Protocol, RpcProtocol, TunnelProtocol -from sjrpc.core.exceptions import RpcError, NoFreeLabelError +from sjrpc.core.exceptions import (RpcError, NoFreeLabelError, + FallbackModeEnabledError) import pyev @@ -62,6 +63,9 @@ class RpcConnection(object): self._sock = sock sock.setblocking(False) + # Initialization requires fallback mode disabled: + self.fallback = False + # Get the pyev loop: if loop is None: self.loop = pyev.default_loop() @@ -294,6 +298,9 @@ class RpcConnection(object): ''' Register a new protocol for the specified label. ''' + if self.fallback: + raise FallbackModeEnabledError('Fallback mode is not compatible ' + 'with protocols') if label is None: for label in xrange(0, RpcConnection.MAX_LABEL): if label not in self._protocols: @@ -312,6 +319,9 @@ class RpcConnection(object): Unregister the specified protocol label for this connection. ''' + if self.fallback: + raise FallbackModeEnabledError('Fallback mode is not compatible ' + 'with protocols') if label in self._protocols and label != 0: del self._protocols[label] else: