16 from contextlib
import contextmanager
23 from xml.parsers.expat
import ExpatError
26 from robot.utils import (DotDict, is_bytes, is_dict_like, is_list_like, is_number,
27 is_string, safe_str, timestr_to_secs)
31 ROBOT_LIBRARY_SCOPE =
'TEST SUITE'
45 def __init__(self, uri='http://127.0.0.1:8270
', timeout=None):
57 return [name
for name
in self.
_lib_info_lib_info
58 if not (name[:2] ==
'__' and name[-2:] ==
'__')]
61 except TypeError
as error:
62 raise RuntimeError(
'Connecting remote server at %s failed: %s'
63 % (self.
_uri_uri, error))
72 return self.
_lib_info_lib_info
is not None
75 return self.
_get_kw_info_get_kw_info(name,
'args', self.
_client_client.get_keyword_arguments,
80 return self.
_lib_info_lib_info[kw].get(info, default)
94 return self.
_get_kw_info_get_kw_info(name,
'doc', self.
_client_client.get_keyword_documentation)
98 args = coercer.coerce(args)
99 kwargs = coercer.coerce(kwargs)
101 sys.stdout.write(result.output)
102 if result.status !=
'PASS':
103 raise RemoteError(result.error, result.traceback, result.fatal,
105 return result.return_
109 binary = re.compile(
'[\x00-\x08\x0B\x0C\x0E-\x1F]')
110 non_ascii = re.compile(
'[\x80-\xff]')
113 for handles, handler
in [(is_string, self.
_handle_string_handle_string),
118 (
lambda arg:
True, self.
_to_string_to_string)]:
119 if handles(argument):
120 return handler(argument)
128 return (self.
binarybinary.search(arg)
or
135 arg = arg.encode(
'latin-1')
137 raise ValueError(
'Cannot represent %r as binary.' % arg)
138 return xmlrpc.client.Binary(arg)
141 return xmlrpc.client.Binary(arg)
147 return [self.
coercecoerce(item)
for item
in arg]
150 return dict((self.
_to_key_to_key(key), self.
coercecoerce(arg[key]))
for key
in arg)
158 item =
safe_str(item)
if item
is not None else ''
162 if isinstance(key, xmlrpc.client.Binary):
163 raise ValueError(
'Dictionary keys cannot be binary. Got %r.' % (key.data,))
170 raise RuntimeError(
'Invalid remote result dictionary: %s' % result)
176 self.
fatalfatal = bool(self.
_get_get(result,
'fatal',
False))
179 def _get(self, result, key, default=''):
180 value = result.get(key, default)
184 if isinstance(value, xmlrpc.client.Binary):
185 return bytes(value.data)
187 return DotDict((k, self.
_convert_convert(v))
for k, v
in value.items())
189 return [self.
_convert_convert(v)
for v
in value]
204 if self.
uriuri.startswith(
'https://'):
208 server = xmlrpc.client.ServerProxy(self.
uriuri, encoding=
'UTF-8',
212 except (socket.error, xmlrpc.client.Error)
as err:
219 return server.get_library_information()
223 return server.get_keyword_names()
227 return server.get_keyword_arguments(name)
231 return server.get_keyword_types(name)
235 return server.get_keyword_tags(name)
239 return server.get_keyword_documentation(name)
243 run_keyword_args = [name, args, kwargs]
if kwargs
else [name, args]
245 return server.run_keyword(*run_keyword_args)
246 except xmlrpc.client.Fault
as err:
247 message = err.faultString
248 except socket.error
as err:
249 message =
'Connection to remote server broken: %s' % err
250 except ExpatError
as err:
251 message = (
'Processing XML-RPC return value failed. '
252 'Most often this happens when the return value '
253 'contains characters that are not valid in XML. '
254 'Original error was: ExpatError: %s' % err)
265 _connection_class = http.client.HTTPConnection
268 xmlrpc.client.Transport.__init__(self, use_datetime)
270 timeout = socket._GLOBAL_DEFAULT_TIMEOUT
276 chost, self._extra_headers, x509 = self.get_host_info(host)
285 _connection_class = http.client.HTTPSConnection
Used by Remote library to report remote errors.
def _validate_key(self, key)
def _handle_binary_in_string(self, arg)
def _handle_bytes(self, arg)
def _to_string(self, item)
def _pass_through(self, arg)
def _coerce_dict(self, arg)
def _string_contains_binary(self, arg)
def _handle_string(self, arg)
def _coerce_list(self, arg)
def coerce(self, argument)
def __init__(self, result)
def _convert(self, value)
def _get(self, result, key, default='')
def __init__(self, uri='http://127.0.0.1:8270', timeout=None)
Connects to a remote server at uri.
def get_keyword_tags(self, name)
def get_keyword_types(self, name)
def get_keyword_names(self)
def _is_lib_info_available(self)
def _get_kw_info(self, kw, info, getter, default=None)
def get_keyword_documentation(self, name)
def get_keyword_arguments(self, name)
def run_keyword(self, name, args, kwargs)
def make_connection(self, host)
def __init__(self, use_datetime=0, timeout=None)
def get_keyword_types(self, name)
def get_library_information(self)
def get_keyword_arguments(self, name)
def get_keyword_names(self)
def get_keyword_documentation(self, name)
def run_keyword(self, name, args, kwargs)
def get_keyword_tags(self, name)
def __init__(self, uri, timeout=None)
def timestr_to_secs(timestr, round_to=3, accept_plain_values=True)
Parses time strings like '1h 10s', '01:00:10' and '42' and returns seconds.