4444NON_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+
144163def RemoteLibraryFactory (library ):
145164 if inspect .ismodule (library ):
146165 return StaticRemoteLibrary (library )
0 commit comments