def make_http_call(callname, data): """Make an IPC call via HTTP and wait for it to return. The contents of data will be expanded to kwargs and passed into the target function.""" from collections import OrderedDict try: # Python 3 from urllib.request import build_opener, install_opener, ProxyHandler, HTTPError, URLError, urlopen except ImportError: # Python 2 from urllib2 import build_opener, install_opener, ProxyHandler, HTTPError, URLError, urlopen import json LOG.debug('Handling HTTP IPC call to {}'.format(callname)) # Note: On python 3, using 'localhost' slowdown the call (Windows OS is affected) not sure if it is an urllib issue url = 'http://127.0.0.1:{}/{}'.format(G.LOCAL_DB.get_value('ns_service_port', 8001), callname) install_opener(build_opener(ProxyHandler({}))) # don't use proxy for localhost try: result = json.loads( urlopen(url=url, data=json.dumps(data).encode('utf-8'), timeout=IPC_TIMEOUT_SECS).read(), object_pairs_hook=OrderedDict) except HTTPError as exc: result = json.loads(exc.reason) except URLError as exc: # On PY2 the exception message have to be decoded with latin-1 for system with symbolic characters err_msg = G.py2_decode(str(exc), 'latin-1') if '10049' in err_msg: err_msg += '\r\nPossible cause is wrong localhost settings in your operative system.' LOG.error(err_msg) raise_from(exceptions.BackendNotReady(G.py2_encode(err_msg, encoding='latin-1')), exc) _raise_for_error(result) return result
def make_http_call(endpoint, func_name, data=None): """ Make an IPC call via HTTP and wait for it to return. The contents of data will be expanded to kwargs and passed into the target function. """ from urllib.request import build_opener, install_opener, ProxyHandler, urlopen from urllib.error import URLError # Note: Using 'localhost' as address slowdown the call (Windows OS is affected) not sure if it is an urllib issue url = 'http://127.0.0.1:{}{}/{}'.format( G.LOCAL_DB.get_value('nf_server_service_port'), endpoint, func_name) LOG.debug('Handling HTTP IPC call to {}'.format(url)) install_opener(build_opener(ProxyHandler( {}))) # don't use proxy for localhost try: with urlopen(url=url, data=pickle.dumps(data, protocol=pickle.HIGHEST_PROTOCOL), timeout=IPC_TIMEOUT_SECS) as f: received_data = f.read() if received_data: _data = pickle.loads(received_data) if isinstance(_data, Exception): raise _data return _data return None # except HTTPError as exc: # raise exc except URLError as exc: err_msg = str(exc) if '10049' in err_msg: err_msg += '\r\nPossible cause is wrong localhost settings in your operative system.' LOG.error(err_msg) raise exceptions.BackendNotReady(err_msg) from exc
def make_http_call_cache(callname, params, data): """Make an IPC call via HTTP and wait for it to return. The contents of data will be expanded to kwargs and passed into the target function.""" try: # Python 3 from urllib.request import build_opener, install_opener, ProxyHandler, HTTPError, URLError, Request, urlopen except ImportError: # Python 2 from urllib2 import build_opener, install_opener, ProxyHandler, HTTPError, URLError, Request, urlopen import json # debug('Handling HTTP IPC call to {}'.format(callname)) # Note: On python 3, using 'localhost' slowdown the call (Windows OS is affected) not sure if it is an urllib issue url = 'http://127.0.0.1:{}/{}'.format(G.LOCAL_DB.get_value('cache_service_port', 8002), callname) install_opener(build_opener(ProxyHandler({}))) # don't use proxy for localhost r = Request(url=url, data=data, headers={'Params': json.dumps(params)}) try: result = urlopen(r, timeout=IPC_TIMEOUT_SECS).read() except HTTPError as exc: if exc.reason in exceptions.__dict__: raise_from(exceptions.__dict__[exc.reason], exc) raise_from(Exception('The service has returned: {}'.format(exc.reason)), exc) except URLError as exc: # On PY2 the exception message have to be decoded with latin-1 for system with symbolic characters err_msg = G.py2_decode(str(exc), 'latin-1') if '10049' in err_msg: err_msg += '\r\nPossible cause is wrong localhost settings in your operative system.' LOG.error(err_msg) raise_from(exceptions.BackendNotReady(G.py2_encode(err_msg, encoding='latin-1')), exc) return result