16 from __future__
import absolute_import
22 import http.client
as httplib
23 import xmlrpc.client
as xmlrpclib
30 from xml.parsers.expat
import ExpatError
37 is_string, timestr_to_secs, unic, DotDict,
38 IRONPYTHON, JYTHON, PY2)
42 ROBOT_LIBRARY_SCOPE =
'TEST SUITE'
58 def __init__(self, uri='http://127.0.0.1:8270
', timeout=None):
67 for i
in range(attempts):
71 except TypeError
as err:
73 raise RuntimeError(
'Connecting remote server at %s failed: %s'
74 % (self.
_uri_uri, error))
102 args = coercer.coerce(args)
103 kwargs = coercer.coerce(kwargs)
105 sys.stdout.write(result.output)
106 if result.status !=
'PASS':
107 raise RemoteError(result.error, result.traceback, result.fatal,
109 return result.return_
113 binary = re.compile(
'[\x00-\x08\x0B\x0C\x0E-\x1F]')
114 non_ascii = re.compile(
'[\x80-\xff]')
117 for handles, handler
in [(is_string, self.
_handle_string_handle_string),
122 (
lambda arg:
True, self.
_to_string_to_string)]:
123 if handles(argument):
124 return handler(argument)
132 return (self.
binarybinary.search(arg)
or
138 arg = arg.encode(
'ASCII')
140 raise ValueError(
'Cannot represent %r as binary.' % arg)
141 return xmlrpclib.Binary(arg)
145 if IRONPYTHON
or JYTHON:
147 return xmlrpclib.Binary(arg)
153 return [self.
coercecoerce(item)
for item
in arg]
156 return dict((self.
_to_key_to_key(key), self.
coercecoerce(arg[key]))
for key
in arg)
164 item =
unic(item)
if item
is not None else ''
168 if isinstance(key, xmlrpclib.Binary):
169 raise ValueError(
'Dictionary keys cannot be binary. Got %s%r.'
170 % (
'b' if PY2
else '', key.data))
175 raise ValueError(
'Dictionary keys cannot contain non-ASCII '
176 'characters on IronPython. Got %r.' % key)
183 raise RuntimeError(
'Invalid remote result dictionary: %s' % result)
189 self.
fatalfatal = bool(self.
_get_get(result,
'fatal',
False))
192 def _get(self, result, key, default=''):
193 value = result.get(key, default)
197 if isinstance(value, xmlrpclib.Binary):
198 return bytes(value.data)
200 return DotDict((k, self.
_convert_convert(v))
for k, v
in value.items())
202 return [self.
_convert_convert(v)
for v
in value]
209 if uri.startswith(
'https://'):
213 self.
_server_server = xmlrpclib.ServerProxy(uri, encoding=
'UTF-8',
219 except (socket.error, xmlrpclib.Error)
as err:
225 except xmlrpclib.Error:
231 except xmlrpclib.Error:
237 except xmlrpclib.Error:
243 except xmlrpclib.Error:
247 run_keyword_args = [name, args, kwargs]
if kwargs
else [name, args]
250 except xmlrpclib.Fault
as err:
251 message = err.faultString
252 except socket.error
as err:
253 message =
'Connection to remote server broken: %s' % err
254 except ExpatError
as err:
255 message = (
'Processing XML-RPC return value failed. '
256 'Most often this happens when the return value '
257 'contains characters that are not valid in XML. '
258 'Original error was: ExpatError: %s' % err)
259 raise RuntimeError(message)
269 _connection_class = httplib.HTTPConnection
272 xmlrpclib.Transport.__init__(self, use_datetime)
274 timeout = socket._GLOBAL_DEFAULT_TIMEOUT
280 chost, self._extra_headers, x509 = self.get_host_info(host)
290 xmlrpclib.Transport.__init__(self, use_datetime)
292 raise RuntimeError(
'Timeouts are not supported on IronPython.')
299 _connection_class = httplib.HTTPSConnection
Used by Remote library to report remote errors.
def coerce(self, argument)
def _pass_through(self, arg)
def _coerce_list(self, arg)
def _handle_string(self, arg)
def _handle_bytes(self, arg)
def _string_contains_binary(self, arg)
def _coerce_dict(self, arg)
def _to_string(self, item)
def _handle_binary_in_string(self, arg)
def _validate_key(self, key)
def _convert(self, value)
def _get(self, result, key, default='')
def __init__(self, result)
def get_keyword_tags(self, name)
def get_keyword_types(self, name)
def get_keyword_documentation(self, name)
def get_keyword_names(self, attempts=2)
def run_keyword(self, name, args, kwargs)
def get_keyword_arguments(self, name)
def __init__(self, uri='http://127.0.0.1:8270', timeout=None)
Connects to a remote server at uri.
def make_connection(self, host)
def __init__(self, use_datetime=0, timeout=None)
def get_keyword_names(self)
def get_keyword_arguments(self, name)
def get_keyword_tags(self, name)
def run_keyword(self, name, args, kwargs)
def get_keyword_types(self, name)
def get_keyword_documentation(self, name)
def __init__(self, uri, timeout=None)
def timestr_to_secs(timestr, round_to=3)
Parses time like '1h 10s', '01:00:10' or '42' and returns seconds.