44
44
NON_ASCII = re .compile ('[\x80 -\xff ]' )
45
45
46
46
47
- class RobotRemoteServer (SimpleXMLRPCServer ):
47
+ class RobotRemoteServer (object ):
48
48
allow_reuse_address = True
49
49
50
50
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,
62
62
:param allow_stop: Allow/disallow stopping the server using
63
63
``Stop Remote Server`` keyword.
64
64
"""
65
- SimpleXMLRPCServer . __init__ ( self , (host , int (port )), logRequests = False )
65
+ self . _server = StoppableXMLRPCServer (host , int (port ))
66
66
self ._library = RemoteLibraryFactory (library )
67
67
self ._allow_stop = allow_stop
68
- self ._shutdown = False
69
- self ._register_functions ()
68
+ self ._register_functions (self ._server )
70
69
self ._register_signal_handlers ()
71
70
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
73
76
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 )
80
83
81
84
def _register_signal_handlers (self ):
82
85
def stop_with_signal (signum , frame ):
@@ -94,26 +97,14 @@ def _announce_start(self, port_file=None):
94
97
with open (port_file , 'w' ) as pf :
95
98
pf .write (str (port ))
96
99
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
-
109
100
def stop_remote_server (self ):
110
101
prefix = 'Robot Framework remote server at %s:%s ' % self .server_address
111
102
if self ._allow_stop :
112
103
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
117
108
118
109
def _log (self , msg , level = None ):
119
110
if level :
@@ -130,17 +121,45 @@ def get_keyword_names(self):
130
121
return self ._library .get_keyword_names () + ['stop_remote_server' ]
131
122
132
123
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 )
136
127
137
128
def get_keyword_arguments (self , name ):
129
+ if name == 'stop_remote_server' :
130
+ return []
138
131
return self ._library .get_keyword_arguments (name )
139
132
140
133
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.' )
141
137
return self ._library .get_keyword_documentation (name )
142
138
143
139
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
+
144
163
def RemoteLibraryFactory (library ):
145
164
if inspect .ismodule (library ):
146
165
return StaticRemoteLibrary (library )
0 commit comments