if isinstance(error_response, dict): if error_response.get('error', None) == API_RATE_LIMITS_ERROR_MESSAGE: if retries_left == 0: msg = ( f'{self.name} {case} request failed after retrying ' f'{API_REQUEST_RETRY_TIMES} times.' ) self.msg_aggregator.add_error( f'Got remote error while querying {self.name} {case}: {msg}', ) return [] # type: ignore # bug list nothing # Trigger retry log.debug( f'{self.name} {case} request reached the rate limits. Backing off', seconds=API_REQUEST_RETRY_AFTER_SECONDS, options=call_options, ) retries_left -= 1 gevent.sleep(API_REQUEST_RETRY_AFTER_SECONDS) continue # Unexpected JSON dict case, better to log it msg = f'Unexpected {self.name} {case} unsuccessful response JSON' log.error(msg, error_response=error_response) self.msg_aggregator.add_error( f'Got remote error while querying {self.name} {case}: {msg}', ) return [] # type: ignore # bug list nothing return self._process_unsuccessful_response(
has_results = False is_result_timesamp_gt_end_ts = False result: Union[Trade, AssetMovement] for raw_result in response_list: if raw_result['type'] not in raw_result_type_filter: continue try: result_timestamp = deserialize_timestamp_from_bitstamp_date( raw_result['datetime'], ) if result_timestamp > end_ts: is_result_timesamp_gt_end_ts = True # prevent extra request break log.debug( f'Attempting to deserialize bitstamp {case_pretty}: {raw_result}' ) result = deserialization_method(raw_result) except DeserializationError as e: msg = str(e) log.error( f'Error processing a Bitstamp {case_pretty}.', raw_result=raw_result, error=msg, ) self.msg_aggregator.add_error( f'Failed to deserialize a Bitstamp {case_pretty}. ' f'Check logs for details. Ignoring it.', ) continue
self.secret, msg=message.encode('utf-8'), digestmod=hashlib.sha256, ).digest(), ).decode('utf-8') passphrase = base64.b64encode( hmac.new( self.secret, self.api_passphrase.encode('utf-8'), hashlib.sha256, ).digest()).decode('utf-8') self.session.headers.update({ 'KC-API-SIGN': signature, 'KC-API-TIMESTAMP': timestamp, 'KC-API-PASSPHRASE': passphrase, }) log.debug('Kucoin API request', request_url=request_url) try: response = self.session.get(url=request_url, timeout=DEFAULT_TIMEOUT_TUPLE) except requests.exceptions.RequestException as e: raise RemoteError( f'Kucoin {method} request at {request_url} connection error: {str(e)}.', ) from e log.debug('Kucoin API response', text=response.text) # Check request rate limit if response.status_code in (HTTPStatus.FORBIDDEN, HTTPStatus.TOO_MANY_REQUESTS): if retries_left == 0: msg = (f'Kucoin {case} request failed after retrying ' f'{API_REQUEST_RETRY_TIMES} times.')
self.msg_aggregator.add_error( f'Got remote error while querying Bistamp trades: {msg}', ) no_results: Union[List[Trade], List[AssetMovement]] = [] # type: ignore return no_results has_results = False is_result_timestamp_gt_end_ts = False result: Union[Trade, AssetMovement] for raw_result in response_list: try: entry_type = deserialize_int_from_str( raw_result['type'], 'bitstamp event') if entry_type not in raw_result_type_filter: log.debug( f'Skipping entry {raw_result} due to type mismatch' ) continue result_timestamp = deserialize_timestamp_from_bitstamp_date( raw_result['datetime'], ) if result_timestamp > end_ts: is_result_timestamp_gt_end_ts = True # prevent extra request break log.debug( f'Attempting to deserialize bitstamp {case_pretty}: {raw_result}' ) result = deserialization_method(raw_result) except DeserializationError as e: