Skip to content

Commit 98d304c

Browse files
committed
Split XMLRPC server to own class
1 parent 7c95dd9 commit 98d304c

File tree

1 file changed

+49
-30
lines changed

1 file changed

+49
-30
lines changed

src/robotremoteserver.py

Lines changed: 49 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
NON_ASCII = re.compile('[\x80-\xff]')
4545

4646

47-
class RobotRemoteServer(SimpleXMLRPCServer):
47+
class RobotRemoteServer(object):
4848
allow_reuse_address = True
4949

5050
def __init__(self, library, host='127.0.0.1', port=8270, port_file=None,
@@ -62,21 +62,24 @@ def __init__(self, library, host='127.0.0.1', port=8270, port_file=None,
6262
:param allow_stop: Allow/disallow stopping the server using
6363
``Stop Remote Server`` keyword.
6464
"""
65-
SimpleXMLRPCServer.__init__(self, (host, int(port)), logRequests=False)
65+
self._server = StoppableXMLRPCServer(host, int(port))
6666
self._library = RemoteLibraryFactory(library)
6767
self._allow_stop = allow_stop
68-
self._shutdown = False
69-
self._register_functions()
68+
self._register_functions(self._server)
7069
self._register_signal_handlers()
7170
self._announce_start(port_file)
72-
self.serve_forever()
71+
self._server.start()
72+
73+
@property
74+
def server_address(self):
75+
return self._server.server_address
7376

74-
def _register_functions(self):
75-
self.register_function(self.get_keyword_names)
76-
self.register_function(self.run_keyword)
77-
self.register_function(self.get_keyword_arguments)
78-
self.register_function(self.get_keyword_documentation)
79-
self.register_function(self.stop_remote_server)
77+
def _register_functions(self, server):
78+
server.register_function(self.get_keyword_names)
79+
server.register_function(self.run_keyword)
80+
server.register_function(self.get_keyword_arguments)
81+
server.register_function(self.get_keyword_documentation)
82+
server.register_function(self.stop_remote_server)
8083

8184
def _register_signal_handlers(self):
8285
def stop_with_signal(signum, frame):
@@ -94,26 +97,14 @@ def _announce_start(self, port_file=None):
9497
with open(port_file, 'w') as pf:
9598
pf.write(str(port))
9699

97-
def serve_forever(self):
98-
if hasattr(self, 'timeout'):
99-
self.timeout = 0.5
100-
elif sys.platform.startswith('java'):
101-
self.socket.settimeout(0.5)
102-
while not self._shutdown:
103-
try:
104-
self.handle_request()
105-
except (OSError, select.error) as err:
106-
if err.args[0] != errno.EINTR:
107-
raise
108-
109100
def stop_remote_server(self):
110101
prefix = 'Robot Framework remote server at %s:%s ' % self.server_address
111102
if self._allow_stop:
112103
self._log(prefix + 'stopping.')
113-
self._shutdown = True
114-
else:
115-
self._log(prefix + 'does not allow stopping.', 'WARN')
116-
return self._shutdown
104+
self._server.stop()
105+
return True
106+
self._log(prefix + 'does not allow stopping.', 'WARN')
107+
return False
117108

118109
def _log(self, msg, level=None):
119110
if level:
@@ -130,17 +121,45 @@ def get_keyword_names(self):
130121
return self._library.get_keyword_names() + ['stop_remote_server']
131122

132123
def run_keyword(self, name, args, kwargs=None):
133-
if name != 'stop_remote_server':
134-
return self._library.run_keyword(name, args, kwargs)
135-
return KeywordRunner(self.stop_remote_server).run_keyword(args, kwargs)
124+
if name == 'stop_remote_server':
125+
return KeywordRunner(self.stop_remote_server).run_keyword(args, kwargs)
126+
return self._library.run_keyword(name, args, kwargs)
136127

137128
def get_keyword_arguments(self, name):
129+
if name == 'stop_remote_server':
130+
return []
138131
return self._library.get_keyword_arguments(name)
139132

140133
def get_keyword_documentation(self, name):
134+
if name == 'stop_remote_server':
135+
return ('Stop the remote server unless stopping is disabled.\n\n'
136+
'Return ``True/False`` depending was server stopped or not.')
141137
return self._library.get_keyword_documentation(name)
142138

143139

140+
class StoppableXMLRPCServer(SimpleXMLRPCServer):
141+
allow_reuse_address = True
142+
143+
def __init__(self, host, port):
144+
SimpleXMLRPCServer.__init__(self, (host, port), logRequests=False)
145+
self._shutdown = False
146+
147+
def start(self):
148+
if hasattr(self, 'timeout'):
149+
self.timeout = 0.5
150+
elif sys.platform.startswith('java'):
151+
self.socket.settimeout(0.5)
152+
while not self._shutdown:
153+
try:
154+
self.handle_request()
155+
except (OSError, select.error) as err:
156+
if err.args[0] != errno.EINTR:
157+
raise
158+
159+
def stop(self):
160+
self._shutdown = True
161+
162+
144163
def RemoteLibraryFactory(library):
145164
if inspect.ismodule(library):
146165
return StaticRemoteLibrary(library)

0 commit comments

Comments
 (0)