|
2 | 2 |
|
3 | 3 | from urllib.parse import urlparse |
4 | 4 |
|
5 | | -import requests |
| 5 | +from requests import Session, RequestException, ConnectionError |
| 6 | +from requests.exceptions import Timeout |
6 | 7 | from requests.adapters import HTTPAdapter |
7 | 8 |
|
8 | | -from .exceptions import CloudFlareAPIError |
| 9 | +class CFnetworkError(Exception): |
| 10 | + """ errors for network calls """ |
9 | 11 |
|
10 | 12 | class CFnetwork(): |
11 | | - """Network for Cloudflare API""" |
| 13 | + """ CFnetwork """ |
12 | 14 |
|
13 | | - def __init__( |
14 | | - self, use_sessions=True, global_request_timeout=5, max_request_retries=5 |
15 | | - ): |
16 | | - """Network for Cloudflare API""" |
| 15 | + def __init__(self, use_sessions=True, global_request_timeout=5, max_request_retries=5): |
| 16 | + """ CFnetwork """ |
17 | 17 |
|
18 | 18 | self.use_sessions = use_sessions |
19 | 19 | self.global_request_timeout = global_request_timeout |
20 | 20 | self.max_request_retries = max_request_retries |
21 | 21 | self.session = None |
22 | 22 |
|
23 | 23 | def __call__(self, method, url, headers=None, params=None, data_str=None, data_json=None, files=None): |
24 | | - """Network for Cloudflare API""" |
| 24 | + """ __call__ """ |
25 | 25 |
|
26 | 26 | if self.use_sessions: |
27 | 27 | if self.session is None: |
28 | | - s = requests.Session() |
| 28 | + s = Session() |
29 | 29 | if self.max_request_retries is not None: |
30 | | - hostname = urlparse(url).netloc |
31 | | - s.mount( |
32 | | - f"https://{hostname}", |
33 | | - HTTPAdapter(max_retries=self.max_request_retries), |
34 | | - ) |
| 30 | + prefix = 'https://%s' % (urlparse(url).netloc), |
| 31 | + s.mount(prefix, HTTPAdapter(max_retries=self.max_request_retries)) |
35 | 32 | self.session = s |
36 | 33 | else: |
| 34 | + # only now do we import all of requests ... it's a rare case |
| 35 | + import requests |
37 | 36 | self.session = requests |
38 | 37 |
|
| 38 | + try: |
| 39 | + r = self._do_network(method, url, headers, params, data_str, data_json, files) |
| 40 | + except RequestException as e: |
| 41 | + raise CFnetworkError('network request exception error: %s' % (e)) from None |
| 42 | + except Timeout as e: |
| 43 | + raise CFnetworkError('network request timeout error: %s' % (e)) from None |
| 44 | + except ConnectionError as e: |
| 45 | + raise CFnetworkError('network request connection error: %s' % (e)) from None |
| 46 | + |
| 47 | + return r |
| 48 | + |
| 49 | + def _do_network(self, method, url, headers, params, data_str, data_json, files): |
| 50 | + """ _do_network """ |
39 | 51 | method = method.upper() |
40 | 52 |
|
41 | 53 | # https://docs.python-requests.org/en/latest/user/quickstart/#post-a-multipart-encoded-file |
@@ -91,12 +103,12 @@ def __call__(self, method, url, headers=None, params=None, data_str=None, data_j |
91 | 103 | ) |
92 | 104 | else: |
93 | 105 | # should never happen |
94 | | - raise CloudFlareAPIError(0, 'method not supported') |
95 | | - |
| 106 | + raise CFnetworkError('internal error - http method invalid: %s' % (method)) |
| 107 | + # success! |
96 | 108 | return r |
97 | 109 |
|
98 | 110 | def __del__(self): |
99 | | - """Network for Cloudflare API""" |
| 111 | + """ __del__ """ |
100 | 112 |
|
101 | 113 | if self.use_sessions and self.session: |
102 | 114 | self.session.close() |
|
0 commit comments