diff --git a/ryu/lib/rpc.py b/ryu/lib/rpc.py index 6b8a0abf7..c1cea8159 100644 --- a/ryu/lib/rpc.py +++ b/ryu/lib/rpc.py @@ -62,7 +62,7 @@ def _create_msgid(self): def create_request(self, method, params): assert isinstance(method, str) - assert isinstance(params, list) + assert isinstance(params, (list, dict)) msgid = self._create_msgid() return (self._packer.pack([MessageType.REQUEST, msgid, method, params]), msgid) @@ -75,7 +75,7 @@ def create_response(self, msgid, error=None, result=None): def create_notification(self, method, params): assert isinstance(method, str) - assert isinstance(params, list) + assert isinstance(params, (list, dict)) return self._packer.pack([MessageType.NOTIFY, method, params]) def get_and_dispatch_messages(self, data, disp_table): @@ -127,6 +127,7 @@ def __init__(self, sock, encoder=None, disp_table=None): self._notifications = deque() self._responses = {} self._incoming = 0 # number of incoming messages in our queues + self.closed_by_peer = False def selectable(self): rlist = [self._sock] @@ -154,7 +155,7 @@ def block(self): select.select(rlist, wlist, rlist + wlist) def serve(self): - while True: + while not self.closed_by_peer: self.block() self.process() @@ -194,6 +195,9 @@ def receive_messages(self, all=False): except IOError: packet = None if not packet: + if packet is not None: + # socket closed by peer + self.closed_by_peer = True break self._encoder.get_and_dispatch_messages(packet, self._table) return self._incoming > 0