Skip to content

Commit

Permalink
Allow server_listen to randomly choose port.
Browse files Browse the repository at this point in the history
  • Loading branch information
da4089 committed Feb 1, 2018
1 parent e3dccba commit 241c9cd
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 10 deletions.
7 changes: 4 additions & 3 deletions python/fixtool/agent.py
Expand Up @@ -189,9 +189,10 @@ def listen(self, port):
self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self._socket.bind(('', port))
self._socket.listen(5)
actual_port = self._socket.getsockname()[1]

asyncio.get_event_loop().add_reader(self._socket, self.acceptable)
return
return actual_port

def unlisten(self):
"""Stop listening for client connections."""
Expand Down Expand Up @@ -769,9 +770,9 @@ def handle_server_listen(self, control: ControlSession, message: dict):
control.send(response.to_json().encode())
return

server.listen(port)
actual_port = server.listen(port)

response = ServerListenedMessage(name, True, '')
response = ServerListenedMessage(name, True, '', actual_port)
control.send(response.to_json().encode())
return

Expand Down
9 changes: 6 additions & 3 deletions python/fixtool/message.py
Expand Up @@ -444,24 +444,27 @@ def from_dict(d):


class ServerListenedMessage:
def __init__(self, name: str, result: bool, message: str):
def __init__(self, name: str, result: bool, message: str, port: int):
self.type = "server_listened"
self.name = name
self.result = result
self.message = message
self.port = port
return

def to_json(self):
return json.dumps({"type": self.type,
"name": self.name,
"result": self.result,
"message": self.message})
"message": self.message,
"port": self.port})

@staticmethod
def from_dict(d):
return ServerListenedMessage(d.get("name"),
d.get("result"),
d.get("message"))
d.get("message"),
d.get("port"))


class ServerUnlistenMessage:
Expand Down
10 changes: 6 additions & 4 deletions python/fixtool/proxy.py
Expand Up @@ -193,10 +193,11 @@ def destroy(self):
self._destroyed = True
return

def listen(self, port: int):
def listen(self, port: int = 0):
"""Listen for connections on specified port.
:param port: TCP port number on which to listen for connections."""
:param port: TCP port number on which to listen for connections.
:returns: Listening port number."""
assert not self._destroyed

msg = ServerListenMessage(self._name, port)
Expand All @@ -206,8 +207,9 @@ def listen(self, port: int):
if not response.result:
raise RuntimeError(response.message)

self._ports.append(port)
return
actual_port = response.port
self._ports.append(actual_port)
return actual_port

def stop_listening(self, port: int):
"""Stop listening for connections on specified port.
Expand Down

0 comments on commit 241c9cd

Please sign in to comment.