def indexd_rpc_call(path): url = config.INDEXD_URL+path response = None try: response = requests.get(url, headers={'content-type': 'application/json'}, timeout=config.REQUESTS_TIMEOUT) except (Timeout, ReadTimeout, ConnectionError): logger.debug('Could not connect to backend at `{}`.'.format(util.clean_url_for_log(url),)) if response == None: if config.TESTNET: network = 'testnet' elif config.REGTEST: network = 'regtest' else: network = 'mainnet' raise IndexdRPCError('Cannot communicate with {} indexd server at `{}`.'.format(network, util.clean_url_for_log(url))) elif response.status_code == 400: raise IndexdRPCError('Indexd returned error: {} {} {}'.format(response.status_code, response.reason, response.text)) elif response.status_code not in (200, 500): raise IndexdRPCError("Bad response from {}: {} {}".format(util.clean_url_for_log(url), response.status_code, response.reason)) # Return result, with error handling. response_json = response.json() if isinstance(response_json, (list, tuple)) or 'error' not in response_json.keys() or response_json['error'] == None: return response_json else: raise IndexdRPCError('{}'.format(response_json['error']))
def rpc_call(payload): url = config.BACKEND_URL response = None TRIES = 12 for i in range(TRIES): try: response = requests.post( url, data=json.dumps(payload), headers={'content-type': 'application/json'}, verify=(not config.BACKEND_SSL_NO_VERIFY), timeout=config.REQUESTS_TIMEOUT) if i > 0: logger.debug('Successfully connected.') break except (Timeout, ReadTimeout, ConnectionError): logger.debug( 'Could not connect to backend at `{}`. (Try {}/{})'.format( util.clean_url_for_log(url), i + 1, TRIES)) time.sleep(5) if response == None: if config.TESTNET: network = 'testnet' else: network = 'mainnet' raise BackendRPCError( 'Cannot communicate with backend at `{}`. (server is set to run on {}, is backend?)' .format(util.clean_url_for_log(url), network)) elif response.status_code not in (200, 500): raise BackendRPCError( str(response.status_code) + ' ' + response.reason) # Return result, with error handling. response_json = response.json() # Batch query returns a list if isinstance(response_json, list): return response_json if 'error' not in response_json.keys() or response_json['error'] == None: return response_json['result'] elif response_json['error']['code'] == -5: # RPC_INVALID_ADDRESS_OR_KEY raise BackendRPCError('{} Is `txindex` enabled in {} Core?'.format( response_json['error'], config.BTC_NAME)) elif response_json['error']['code'] in [-28, -8, -2]: # “Verifying blocks...” or “Block height out of range” or “The network does not appear to fully agree!“ logger.debug('Backend not ready. Sleeping for ten seconds.') # If Bitcoin Core takes more than `sys.getrecursionlimit() * 10 = 9970` # seconds to start, this’ll hit the maximum recursion depth limit. time.sleep(10) return rpc_call(payload) else: raise BackendRPCError('{}'.format(response_json['error']))
def rpc_call(payload): """Calls to bitcoin core and returns the response""" url = config.BACKEND_URL response = None TRIES = 12 for i in range(TRIES): try: response = requests.post(url, data=json.dumps(payload), headers={'content-type': 'application/json'}, verify=(not config.BACKEND_SSL_NO_VERIFY), timeout=config.REQUESTS_TIMEOUT) if i > 0: logger.debug('Successfully connected.') break except (Timeout, ReadTimeout, ConnectionError): logger.debug('Could not connect to backend at `{}`. (Try {}/{})'.format(util.clean_url_for_log(url), i+1, TRIES)) time.sleep(5) if response == None: if config.TESTNET: network = 'testnet' elif config.REGTEST: network = 'regtest' else: network = 'mainnet' raise BackendRPCError('Cannot communicate with backend at `{}`. (server is set to run on {}, is backend?)'.format(util.clean_url_for_log(url), network)) elif response.status_code in (401,): raise BackendRPCError('Authorization error connecting to {}: {} {}'.format(util.clean_url_for_log(url), response.status_code, response.reason)) elif response.status_code not in (200, 500): raise BackendRPCError(str(response.status_code) + ' ' + response.reason) # Handle json decode errors try: response_json = response.json() except json.decoder.JSONDecodeError as e: raise BackendRPCError('Received invalid JSON from backend with a response of {}'.format(str(response.status_code) + ' ' + response.reason)) # Batch query returns a list if isinstance(response_json, list): return response_json if 'error' not in response_json.keys() or response_json['error'] == None: return response_json['result'] elif response_json['error']['code'] == -5: # RPC_INVALID_ADDRESS_OR_KEY raise BackendRPCError('{} Is `txindex` enabled in {} Core?'.format(response_json['error'], config.BTC_NAME)) elif response_json['error']['code'] in [-28, -8, -2]: # “Verifying blocks...” or “Block height out of range” or “The network does not appear to fully agree!“ logger.debug('Backend not ready. Sleeping for ten seconds.') # If Bitcoin Core takes more than `sys.getrecursionlimit() * 10 = 9970` # seconds to start, this’ll hit the maximum recursion depth limit. time.sleep(10) return rpc_call(payload) else: raise BackendRPCError('Error connecting to {}: {}'.format(util.clean_url_for_log(url), response_json['error']))
def rpc_call(payload): url = config.BACKEND_URL headers = {'content-type': 'application/json'} global bitcoin_rpc_session if not bitcoin_rpc_session: bitcoin_rpc_session = requests.Session() response = None TRIES = 12 for i in range(TRIES): try: response = bitcoin_rpc_session.post(url, data=json.dumps(payload), headers=headers, verify=(not config.BACKEND_SSL_NO_VERIFY), timeout=config.REQUESTS_TIMEOUT) if i > 0: logger.debug('Successfully connected.') break except (Timeout, ReadTimeout, ConnectionError): logger.debug('Could not connect to backend at `{}`. (Try {}/{})'.format(util.clean_url_for_log(url), i+1, TRIES)) time.sleep(5) if response == None: if config.TESTNET: network = 'testnet' else: network = 'mainnet' raise BackendRPCError('Cannot communicate with backend at `{}`. (server is set to run on {}, is backend?)'.format(util.clean_url_for_log(url), network)) elif response.status_code not in (200, 500): raise BackendRPCError(str(response.status_code) + ' ' + response.reason) # Return result, with error handling. response_json = response.json() if 'error' not in response_json.keys() or response_json['error'] == None: return response_json['result'] else: raise BackendRPCError('{}'.format(response_json['error']))
def indexd_rpc_call(path): url = config.INDEXD_URL + path response = None try: response = requests.get(url, headers={'content-type': 'application/json'}, timeout=config.REQUESTS_TIMEOUT) except (Timeout, ReadTimeout, ConnectionError): logger.debug('Could not connect to backend at `{}`.'.format( util.clean_url_for_log(url), )) if response == None: if config.TESTNET: network = 'testnet' elif config.REGTEST: network = 'regtest' else: network = 'mainnet' raise IndexdRPCError( 'Cannot communicate with {} indexd server at `{}`.'.format( network, util.clean_url_for_log(url))) elif response.status_code == 400: raise IndexdRPCError('Indexd returned error: {} {} {}'.format( response.status_code, response.reason, response.text)) elif response.status_code not in (200, 500): raise IndexdRPCError("Bad response from {}: {} {}".format( util.clean_url_for_log(url), response.status_code, response.reason)) # Return result, with error handling. response_json = response.json() if isinstance(response_json, (list, tuple)) or 'error' not in response_json.keys( ) or response_json['error'] == None: return response_json else: raise IndexdRPCError('{}'.format(response_json['error']))