99import requests
1010from urllib3 import Timeout
1111
12- from helpers import strip_url , return_and_validate_rpc_json_result
12+ from helpers import strip_url , return_and_validate_rpc_json_result , return_and_validate_rest_api_json_result # pylint: disable=line-too-long
1313from cache import Cache
1414from log import logger
1515
@@ -37,37 +37,43 @@ def latest_query_latency(self):
3737 self ._latest_query_latency = None
3838 return latency
3939
40- def _return_and_validate_post_request (self , payload : dict ) -> str :
41- """Sends a POST request and validates the http response code. If
42- response code is OK, it returns the response.text, otherwise
43- it returns None.
44- """
40+ def _return_and_validate_request (self , method = 'GET' , payload = None , params = None ):
41+ """Sends a GET or POST request and validates the http response code."""
4542 with self .session as ses :
4643 try :
47- self ._logger .debug ("Querying endpoint." ,
48- payload = payload ,
49- ** self ._logger_metadata )
44+ self ._logger .debug (f"Querying endpoint with { method } ." ,
45+ payload = payload ,
46+ params = params ,
47+ ** self ._logger_metadata )
5048 start_time = perf_counter ()
51- req = ses .post (self .url ,
52- json = payload ,
53- timeout = Timeout (connect = self .connect_timeout ,
54- read = self .response_timeout ))
55- if req .status_code == requests .codes .ok : # pylint: disable=no-member
49+ if method .upper () == 'GET' :
50+ req = ses .get (self .url ,
51+ params = params ,
52+ timeout = Timeout (connect = self .connect_timeout ,
53+ read = self .response_timeout ))
54+ elif method .upper () == 'POST' :
55+ req = ses .post (self .url ,
56+ json = payload ,
57+ timeout = Timeout (connect = self .connect_timeout ,
58+ read = self .response_timeout ))
59+ else :
60+ raise ValueError (f"Unsupported HTTP method: { method } " )
61+
62+ if req .status_code == requests .codes .ok : # pylint: disable=no-member
5663 self ._latest_query_latency = perf_counter () - start_time
5764 return req .text
58- except (IOError , requests .HTTPError ,
59- json .decoder .JSONDecodeError ) as error :
60- self ._logger .error ("Problem while sending a post request." ,
61- payload = payload ,
62- error = error ,
63- ** self ._logger_metadata )
64- return None
65+ except (IOError , requests .HTTPError , json .decoder .JSONDecodeError , ValueError ) as error :
66+ self ._logger .error (f"Problem while sending a { method } request." ,
67+ payload = payload ,
68+ params = params ,
69+ error = error ,
70+ ** self ._logger_metadata )
6571 return None
6672
6773 def json_rpc_post (self , payload ):
6874 """Checks the validity of a successful json-rpc response. If any of the
6975 validations fail, the method returns type None. """
70- response = self ._return_and_validate_post_request ( payload )
76+ response = self ._return_and_validate_request ( method = 'POST' , payload = payload )
7177 if response is not None :
7278 result = return_and_validate_rpc_json_result (
7379 response , self ._logger_metadata )
@@ -76,20 +82,41 @@ def json_rpc_post(self, payload):
7682 return None
7783
7884 def cached_json_rpc_post (self , payload : dict ):
79- """Calls json_rpc_post and stores the result in in-memory
80- cache, by using payload as key.Method will always return
81- cached value after the first call. Cache never expires."""
82- cache_key = str (payload )
85+ """Calls json_rpc_post and stores the result in in-memory cache."""
86+ cache_key = f"rpc:{ str (payload )} "
8387
8488 if self .cache .is_cached (cache_key ):
8589 return_value = self .cache .retrieve_key_value (cache_key )
8690 return return_value
8791
88- value = self .json_rpc_post (payload )
92+ value = self .json_rpc_post (payload = payload )
8993 if value is not None :
9094 self .cache .store_key_value (cache_key , value )
9195 return value
9296
97+ def json_rest_api_get (self , params : dict = None ):
98+ """Checks the validity of a successful json-rpc response. If any of the
99+ validations fail, the method returns type None. """
100+ response = self ._return_and_validate_request (method = 'GET' , params = params )
101+ if response is not None :
102+ result = return_and_validate_rest_api_json_result (
103+ response , self ._logger_metadata )
104+ if result is not None :
105+ return result
106+ return None
107+
108+ def cached_json_rest_api_get (self , params : dict = None ):
109+ """Calls json_rest_api_get and stores the result in in-memory cache."""
110+ cache_key = f"rest:{ str (params )} "
111+
112+ if self .cache .is_cached (cache_key ):
113+ return_value = self .cache .retrieve_key_value (cache_key )
114+ return return_value
115+
116+ value = self .json_rest_api_get (params )
117+ if value is not None :
118+ self .cache .store_key_value (cache_key , value )
119+ return value
93120
94121class WebsocketSubscription (threading .Thread ): # pylint: disable=too-many-instance-attributes
95122 """A thread class used to subscribe and track
0 commit comments