Skip to content

Commit

Permalink
timeout values now work from config or api call, added support for im…
Browse files Browse the repository at this point in the history
…age binary results, fixed logging if binary
  • Loading branch information
mahtin committed Nov 25, 2023
1 parent 453fed3 commit 142a01b
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 7 deletions.
36 changes: 31 additions & 5 deletions CloudFlare/cloudflare.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@

BASE_URL = 'https://api.cloudflare.com/client/v4'

DEFAULT_GLOBAL_REQUEST_TIMEOUT = 5
DEFAULT_MAX_REQUEST_RETRIES = 5

class CloudFlare():
""" Cloudflare v4 API"""

Expand All @@ -24,6 +27,7 @@ class _v4base():
def __init__(self, config):
""" Cloudflare v4 API"""

self.network = None
self.config = config

self.api_email = config['email'] if 'email' in config else None
Expand All @@ -36,8 +40,16 @@ def __init__(self, config):

self.raw = config['raw']
self.use_sessions = config['use_sessions']
self.global_request_timeout = config['global_request_timeout'] if 'global_request_timeout' in config else None
self.max_request_retries = config['max_request_retries'] if 'max_request_retries' in config else None
self.global_request_timeout = config['global_request_timeout'] if 'global_request_timeout' in config else DEFAULT_GLOBAL_REQUEST_TIMEOUT
self.max_request_retries = config['max_request_retries'] if 'max_request_retries' in config else DEFAULT_MAX_REQUEST_RETRIES
try:
self.global_request_timeout = int(self.global_request_timeout)
except (TypeError, ValueError):
self.global_request_timeout = DEFAULT_GLOBAL_REQUEST_TIMEOUT
try:
self.max_request_retries = int(self.max_request_retries)
except (TypeError, ValueError):
self.max_request_retries = DEFAULT_MAX_REQUEST_RETRIES
self.profile = config['profile']
self.network = CFnetwork(
use_sessions=self.use_sessions,
Expand Down Expand Up @@ -245,7 +257,10 @@ def _call_network(self, method, headers, parts, identifiers, params, data, files
response_data = response_data.decode("utf-8")

if self.logger:
self.logger.debug('Response: %d, %s, %s', response_code, response_type, response_data)
if 'text/' == response_type[0:5] or response_type in ['application/javascript', 'application/json']:
self.logger.debug('Response: %d, %s, %s', response_code, response_type, response_data[0:100])
else:
self.logger.debug('Response: %d, %s, %s', response_code, response_type, '...')

if response_code >= 500 and response_code <= 599:
# 500 Internal Server Error
Expand Down Expand Up @@ -421,6 +436,14 @@ def _raw(self, method, headers, parts, identifiers, params, data, files):
'code': response_code,
'result': str(response_data)}

elif response_type[0:6] in ['audio/', 'image/', 'video/']:
# raw - just pass thru
if response_code == requests_codes.ok:
response_data = {'success': True, 'result': response_data}
else:
response_data = {'success': False,
'code': response_code,
'result': response_data}
else:
# Assuming nothing - but continuing anyway
# A single value is returned (vs an array or object)
Expand Down Expand Up @@ -531,7 +554,10 @@ def _call(self, method, headers, parts, identifiers, params, data, files):
except:
result = response_data
if self.logger:
self.logger.debug('Response: %s', result)
if isinstance(result, str):
self.logger.debug('Response: %s', result[0:100])
else:
self.logger.debug('Response: %s', '...')
return result

def _call_unwrapped(self, method, headers, parts, identifiers, params, data, files):
Expand Down Expand Up @@ -913,7 +939,7 @@ def api_from_openapi(self, url):

return api_decode_from_openapi(self._base.api_from_openapi(url))

def __init__(self, email=None, key=None, token=None, certtoken=None, debug=False, raw=False, use_sessions=True, profile=None, base_url=None, global_request_timeout=5, max_request_retries=5):
def __init__(self, email=None, key=None, token=None, certtoken=None, debug=False, raw=False, use_sessions=True, profile=None, base_url=None, global_request_timeout=None, max_request_retries=None):
""" Cloudflare v4 API"""

self._base = None
Expand Down
2 changes: 1 addition & 1 deletion CloudFlare/network.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class CFnetwork:
"""Network for Cloudflare API"""

def __init__(
self, max_request_retries, use_sessions=True, global_request_timeout=5,
self, use_sessions=True, global_request_timeout=5, max_request_retries=5
):
"""Network for Cloudflare API"""

Expand Down
5 changes: 4 additions & 1 deletion CloudFlare/read_configs.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ def read_configs(profile=None):
config['extras'] = os.getenv('CLOUDFLARE_API_EXTRAS') if os.getenv('CLOUDFLARE_API_EXTRAS') is not None else os.getenv('CF_API_EXTRAS')
config['base_url'] = os.getenv('CLOUDFLARE_API_URL') if os.getenv('CLOUDFLARE_API_URL') is not None else os.getenv('CF_API_URL')

config['global_request_timeout'] = os.getenv('CLOUDFLARE_GLOBAL_REQUEST_TIMEOUT')
config['max_request_retries'] = os.getenv('CLOUDFLARE_MAX_REQUEST_RETRIES')

# grab values from config files
cp = configparser.ConfigParser()
try:
Expand Down Expand Up @@ -55,7 +58,7 @@ def read_configs(profile=None):
if not cp.has_section(profile):
raise Exception("%s: configuration section missing - configuration file only has these sections: %s" % (profile, ','.join(cp.sections())))

for option in ['email', 'key', 'token', 'certtoken', 'extras', 'base_url']:
for option in ['email', 'key', 'token', 'certtoken', 'extras', 'base_url', 'global_request_timeout', 'max_request_retries']:
try:
config_value = cp.get(profile, option)
if option == 'extras':
Expand Down

0 comments on commit 142a01b

Please sign in to comment.