|
1 | 1 | """ Network for Cloudflare API""" |
2 | 2 | from __future__ import absolute_import |
3 | 3 |
|
| 4 | +from urllib.parse import urlparse |
| 5 | + |
4 | 6 | import requests |
| 7 | +from requests.adapters import HTTPAdapter |
5 | 8 |
|
6 | 9 | from .exceptions import CloudFlareAPIError |
7 | 10 |
|
8 | | -class CFnetwork(): |
9 | | - """ Network for Cloudflare API""" |
10 | 11 |
|
11 | | - def __init__(self, use_sessions=True): |
12 | | - """ Network for Cloudflare API""" |
| 12 | +class CFnetwork: |
| 13 | + """Network for Cloudflare API""" |
| 14 | + |
| 15 | + def __init__( |
| 16 | + self, max_request_retries, use_sessions=True, global_request_timeout=5, |
| 17 | + ): |
| 18 | + """Network for Cloudflare API""" |
13 | 19 |
|
14 | 20 | self.use_sessions = use_sessions |
| 21 | + self.global_request_timeout = global_request_timeout |
| 22 | + self.max_request_retries = max_request_retries |
15 | 23 | self.session = None |
16 | 24 |
|
17 | 25 | def __call__(self, method, url, headers=None, params=None, data=None, files=None): |
18 | | - """ Network for Cloudflare API""" |
| 26 | + """Network for Cloudflare API""" |
19 | 27 |
|
20 | 28 | if self.use_sessions: |
21 | 29 | if self.session is None: |
22 | | - self.session = requests.Session() |
| 30 | + s = requests.Session() |
| 31 | + if self.max_request_retries is not None: |
| 32 | + hostname = urlparse(url).netloc |
| 33 | + s.mount( |
| 34 | + f"https://{hostname}", |
| 35 | + HTTPAdapter(max_retries=self.max_request_retries), |
| 36 | + ) |
| 37 | + self.session = s |
23 | 38 | else: |
24 | 39 | self.session = requests |
25 | 40 |
|
26 | 41 | method = method.upper() |
27 | 42 |
|
28 | 43 | if method == 'GET': |
29 | | - r = self.session.get(url, headers=headers, params=params, data=data) |
| 44 | + r = self.session.get( |
| 45 | + url, |
| 46 | + headers=headers, |
| 47 | + params=params, |
| 48 | + data=data, |
| 49 | + timeout=self.global_request_timeout, |
| 50 | + ) |
30 | 51 | elif method == 'POST': |
31 | 52 | if isinstance(data, str): |
32 | | - r = self.session.post(url, headers=headers, params=params, data=data, files=files) |
| 53 | + r = self.session.post( |
| 54 | + url, |
| 55 | + headers=headers, |
| 56 | + params=params, |
| 57 | + data=data, |
| 58 | + files=files, |
| 59 | + timeout=self.global_request_timeout, |
| 60 | + ) |
33 | 61 | else: |
34 | | - r = self.session.post(url, headers=headers, params=params, json=data, files=files) |
| 62 | + r = self.session.post( |
| 63 | + url, |
| 64 | + headers=headers, |
| 65 | + params=params, |
| 66 | + json=data, |
| 67 | + files=files, |
| 68 | + timeout=self.global_request_timeout, |
| 69 | + ) |
35 | 70 | elif method == 'PUT': |
36 | 71 | if isinstance(data, str): |
37 | | - r = self.session.put(url, headers=headers, params=params, data=data) |
| 72 | + r = self.session.put( |
| 73 | + url, |
| 74 | + headers=headers, |
| 75 | + params=params, |
| 76 | + data=data, |
| 77 | + timeout=self.global_request_timeout, |
| 78 | + ) |
38 | 79 | else: |
39 | | - r = self.session.put(url, headers=headers, params=params, json=data) |
| 80 | + r = self.session.put( |
| 81 | + url, |
| 82 | + headers=headers, |
| 83 | + params=params, |
| 84 | + json=data, |
| 85 | + timeout=self.global_request_timeout, |
| 86 | + ) |
40 | 87 | elif method == 'DELETE': |
41 | 88 | if isinstance(data, str): |
42 | | - r = self.session.delete(url, headers=headers, params=params, data=data) |
| 89 | + r = self.session.delete( |
| 90 | + url, |
| 91 | + headers=headers, |
| 92 | + params=params, |
| 93 | + data=data, |
| 94 | + timeout=self.global_request_timeout, |
| 95 | + ) |
43 | 96 | else: |
44 | | - r = self.session.delete(url, headers=headers, params=params, json=data) |
| 97 | + r = self.session.delete( |
| 98 | + url, |
| 99 | + headers=headers, |
| 100 | + params=params, |
| 101 | + json=data, |
| 102 | + timeout=self.global_request_timeout, |
| 103 | + ) |
45 | 104 | elif method == 'PATCH': |
46 | 105 | if isinstance(data, str): |
47 | | - r = self.session.request('PATCH', url, headers=headers, params=params, data=data) |
| 106 | + r = self.session.request( |
| 107 | + 'PATCH', |
| 108 | + url, |
| 109 | + headers=headers, |
| 110 | + params=params, |
| 111 | + data=data, |
| 112 | + timeout=self.global_request_timeout, |
| 113 | + ) |
48 | 114 | else: |
49 | | - r = self.session.request('PATCH', url, headers=headers, params=params, json=data) |
| 115 | + r = self.session.request( |
| 116 | + 'PATCH', |
| 117 | + url, |
| 118 | + headers=headers, |
| 119 | + params=params, |
| 120 | + json=data, |
| 121 | + timeout=self.global_request_timeout, |
| 122 | + ) |
50 | 123 | else: |
51 | 124 | # should never happen |
52 | 125 | raise CloudFlareAPIError(0, 'method not supported') |
53 | 126 |
|
54 | 127 | return r |
55 | 128 |
|
56 | 129 | def __del__(self): |
57 | | - """ Network for Cloudflare API""" |
| 130 | + """Network for Cloudflare API""" |
58 | 131 |
|
59 | 132 | if self.use_sessions and self.session: |
60 | 133 | self.session.close() |
|
0 commit comments