PyFunceble-dev 4.3.0a5__py3-none-any.whl → 4.3.0a10__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. PyFunceble/checker/availability/base.py +0 -1
  2. PyFunceble/checker/availability/domain.py +0 -1
  3. PyFunceble/checker/availability/extras/base.py +18 -18
  4. PyFunceble/checker/availability/extras/etoxic.py +0 -1
  5. PyFunceble/checker/availability/extras/parked.py +1 -2
  6. PyFunceble/checker/availability/extras/rules.py +64 -5
  7. PyFunceble/checker/availability/extras/subject_switch.py +1 -1
  8. PyFunceble/checker/availability/ip.py +0 -1
  9. PyFunceble/checker/availability/url.py +0 -1
  10. PyFunceble/checker/reputation/base.py +0 -1
  11. PyFunceble/cli/processes/migrator.py +0 -1
  12. PyFunceble/cli/processes/workers/base.py +5 -3
  13. PyFunceble/cli/processes/workers/dir_files_sorter.py +0 -1
  14. PyFunceble/cli/processes/workers/file_sorter.py +0 -1
  15. PyFunceble/cli/processes/workers/file_sorter_base.py +0 -1
  16. PyFunceble/cli/processes/workers/migrator.py +0 -1
  17. PyFunceble/cli/processes/workers/miner.py +7 -9
  18. PyFunceble/cli/processes/workers/tester.py +2 -6
  19. PyFunceble/cli/scripts/iana.py +11 -1
  20. PyFunceble/cli/scripts/public_suffix.py +14 -1
  21. PyFunceble/cli/system/launcher.py +27 -14
  22. PyFunceble/cli/utils/version.py +27 -15
  23. PyFunceble/config/loader.py +43 -12
  24. PyFunceble/downloader/base.py +13 -3
  25. PyFunceble/helpers/download.py +147 -20
  26. PyFunceble/helpers/hash.py +10 -18
  27. PyFunceble/query/dns/nameserver.py +12 -6
  28. PyFunceble/query/dns/query_tool.py +3 -1
  29. PyFunceble/query/http_status_code.py +9 -7
  30. PyFunceble/query/platform.py +7 -8
  31. PyFunceble/query/requests/adapter/base.py +36 -4
  32. PyFunceble/query/requests/adapter/http.py +2 -3
  33. PyFunceble/query/requests/adapter/https.py +2 -2
  34. PyFunceble/query/requests/requester.py +70 -41
  35. PyFunceble/storage.py +1 -4
  36. {PyFunceble_dev-4.3.0a5.dist-info → PyFunceble_dev-4.3.0a10.dist-info}/METADATA +173 -68
  37. {PyFunceble_dev-4.3.0a5.dist-info → PyFunceble_dev-4.3.0a10.dist-info}/RECORD +41 -41
  38. {PyFunceble_dev-4.3.0a5.dist-info → PyFunceble_dev-4.3.0a10.dist-info}/WHEEL +1 -1
  39. {PyFunceble_dev-4.3.0a5.dist-info → PyFunceble_dev-4.3.0a10.dist-info}/LICENSE +0 -0
  40. {PyFunceble_dev-4.3.0a5.dist-info → PyFunceble_dev-4.3.0a10.dist-info}/entry_points.txt +0 -0
  41. {PyFunceble_dev-4.3.0a5.dist-info → PyFunceble_dev-4.3.0a10.dist-info}/top_level.txt +0 -0
@@ -60,7 +60,6 @@ from sqlalchemy.orm import Session
60
60
 
61
61
  import PyFunceble.checker.utils.whois
62
62
  import PyFunceble.facility
63
- import PyFunceble.factory
64
63
  import PyFunceble.storage
65
64
  from PyFunceble.checker.availability.extras.base import ExtraRuleHandlerBase
66
65
  from PyFunceble.checker.availability.extras.dns import DNSRulesHandler
@@ -51,7 +51,6 @@ License:
51
51
  """
52
52
 
53
53
  import PyFunceble.facility
54
- import PyFunceble.factory
55
54
  import PyFunceble.storage
56
55
  from PyFunceble.checker.availability.base import AvailabilityCheckerBase
57
56
  from PyFunceble.checker.reputation.domain import DomainReputationChecker
@@ -56,10 +56,11 @@ from typing import Callable, Dict, List, Optional, Union
56
56
 
57
57
  import requests
58
58
 
59
- import PyFunceble.factory
59
+ import PyFunceble.storage
60
60
  from PyFunceble.checker.availability.status import AvailabilityCheckerStatus
61
61
  from PyFunceble.helpers.regex import RegexHelper
62
62
  from PyFunceble.query.dns.query_tool import DNSQueryTool
63
+ from PyFunceble.query.requests.requester import Requester
63
64
 
64
65
 
65
66
  class ExtraRuleHandlerBase:
@@ -76,13 +77,14 @@ class ExtraRuleHandlerBase:
76
77
  req: Optional[requests.Response] = None
77
78
  dns_query_tool: Optional[DNSQueryTool] = None
78
79
  regex_helper: Optional[RegexHelper] = None
80
+ requester: Optional[Requester] = None
79
81
 
80
82
  def __init__(self, status: Optional[AvailabilityCheckerStatus] = None) -> None:
81
83
  if status is not None:
82
84
  self.status = status
83
85
 
84
- # Be sure that all settings are loaded proprely!!
85
- PyFunceble.factory.Requester.guess_all_settings()
86
+ self.requester = Requester(config=PyFunceble.storage.CONFIGURATION)
87
+
86
88
  self.dns_query_tool = DNSQueryTool()
87
89
  self.regex_helper = RegexHelper()
88
90
 
@@ -227,9 +229,7 @@ class ExtraRuleHandlerBase:
227
229
  Whether we shoold follow the redirection - or not.
228
230
  """
229
231
 
230
- self.req = PyFunceble.factory.Requester.get(
231
- self.req_url, allow_redirects=allow_redirects
232
- )
232
+ self.req = self.requester.get(self.req_url, allow_redirects=allow_redirects)
233
233
 
234
234
  return self
235
235
 
@@ -272,18 +272,18 @@ class ExtraRuleHandlerBase:
272
272
  method()
273
273
 
274
274
  try:
275
- req = PyFunceble.factory.Requester.get(url, allow_redirects=allow_redirects)
275
+ req = self.requester.get(url, allow_redirects=allow_redirects)
276
276
 
277
277
  if match_mode == "regex":
278
278
  handle_regex_match_mode(req)
279
279
  else:
280
280
  handle_string_match_mode(req)
281
281
  except (
282
- PyFunceble.factory.Requester.exceptions.RequestException,
283
- PyFunceble.factory.Requester.exceptions.InvalidURL,
284
- PyFunceble.factory.Requester.exceptions.Timeout,
285
- PyFunceble.factory.Requester.exceptions.ConnectionError,
286
- PyFunceble.factory.Requester.urllib3_exceptions.InvalidHeader,
282
+ self.requester.exceptions.RequestException,
283
+ self.requester.exceptions.InvalidURL,
284
+ self.requester.exceptions.Timeout,
285
+ self.requester.exceptions.ConnectionError,
286
+ self.requester.urllib3_exceptions.InvalidHeader,
287
287
  socket.timeout,
288
288
  ):
289
289
  pass
@@ -363,18 +363,18 @@ class ExtraRuleHandlerBase:
363
363
  method()
364
364
 
365
365
  try:
366
- req = PyFunceble.factory.Requester.get(url, allow_redirects=allow_redirects)
366
+ req = self.requester.get(url, allow_redirects=allow_redirects)
367
367
 
368
368
  if match_mode == "regex":
369
369
  handle_regex_match_mode(req)
370
370
  else:
371
371
  handle_string_match_mode(req)
372
372
  except (
373
- PyFunceble.factory.Requester.exceptions.RequestException,
374
- PyFunceble.factory.Requester.exceptions.InvalidURL,
375
- PyFunceble.factory.Requester.exceptions.Timeout,
376
- PyFunceble.factory.Requester.exceptions.ConnectionError,
377
- PyFunceble.factory.Requester.urllib3_exceptions.InvalidHeader,
373
+ self.requester.exceptions.RequestException,
374
+ self.requester.exceptions.InvalidURL,
375
+ self.requester.exceptions.Timeout,
376
+ self.requester.exceptions.ConnectionError,
377
+ self.requester.urllib3_exceptions.InvalidHeader,
378
378
  socket.timeout,
379
379
  ):
380
380
  pass
@@ -50,7 +50,6 @@ License:
50
50
  limitations under the License.
51
51
  """
52
52
 
53
- import PyFunceble.factory
54
53
  import PyFunceble.storage
55
54
  from PyFunceble.checker.availability.extras.base import ExtraRuleHandlerBase
56
55
 
@@ -50,7 +50,6 @@ License:
50
50
  limitations under the License.
51
51
  """
52
52
 
53
- import PyFunceble.factory
54
53
  import PyFunceble.storage
55
54
  from PyFunceble.checker.availability.extras.base import ExtraRuleHandlerBase
56
55
 
@@ -127,7 +126,7 @@ class ParkedRulesHandler(ExtraRuleHandlerBase):
127
126
  "Finished to check %r against our own set of parked rules.",
128
127
  self.status.idna_subject,
129
128
  )
130
- except PyFunceble.factory.Requester.exceptions.RequestException:
129
+ except self.requester.exceptions.RequestException:
131
130
  pass
132
131
 
133
132
  return self
@@ -55,7 +55,6 @@ from typing import Optional
55
55
  from box import Box
56
56
 
57
57
  import PyFunceble.facility
58
- import PyFunceble.factory
59
58
  import PyFunceble.storage
60
59
  from PyFunceble.checker.availability.extras.base import ExtraRuleHandlerBase
61
60
  from PyFunceble.checker.availability.status import AvailabilityCheckerStatus
@@ -81,6 +80,7 @@ class ExtraRulesHandler(ExtraRuleHandlerBase):
81
80
  (self.switch_to_down_if_status_code, {410, 424}),
82
81
  ],
83
82
  r"\.24\.eu$": [(self.switch_to_down_if_status_code, 503)],
83
+ r"\.3x\.ro$": [(self.switch_to_down_if_status_code, 404)],
84
84
  r"\.altervista\.org$": [(self.switch_to_down_if_status_code, 403)],
85
85
  r"\.angelfire\.com$": [(self.switch_to_down_if_status_code, 404)],
86
86
  r"\.blogspot\.": [self.handle_blogspot],
@@ -90,14 +90,25 @@ class ExtraRulesHandler(ExtraRuleHandlerBase):
90
90
  r"\.github\.io$": [(self.switch_to_down_if_status_code, 404)],
91
91
  r"\.glitchz\.me$": [(self.switch_to_down_if_status_code, 403)],
92
92
  r"\.godaddysites\.com$": [(self.switch_to_down_if_status_code, 404)],
93
- r"\.hpg.com.br$": [(self.switch_to_down_if_status_code, 404)],
93
+ r"\.hpg\.com\.br$": [(self.switch_to_down_if_status_code, 404)],
94
+ r"^heylink\.me$": [(self.switch_to_down_if_status_code, 410)],
95
+ r"^heyl\.ink$": [(self.switch_to_down_if_status_code, 410)],
94
96
  r"\.imgur\.com$": [self.handle_imgur_dot_com],
95
97
  r"\.liveadvert\.com$": [(self.switch_to_down_if_status_code, 404)],
96
98
  r"\.myhuaweicloudz\.com$": [(self.switch_to_down_if_status_code, 403)],
99
+ r"^scnv\.io$": [(self.switch_to_down_if_status_code, 404)],
97
100
  r"\.skyrock\.com$": [(self.switch_to_down_if_status_code, 404)],
101
+ r"\.squarespace.com$": [
102
+ (self.switch_to_down_if_status_code, 404),
103
+ self.handle_squarespace_com,
104
+ ],
98
105
  r"\.sz.id$": [(self.switch_to_down_if_status_code, 302)],
99
106
  r"\.translate\.goog$": [(self.switch_to_down_if_status_code, 403)],
100
107
  r"\.tumblr\.com$": [(self.switch_to_down_if_status_code, 404)],
108
+ r"\.vercel\.app$": [
109
+ (self.switch_to_down_if_status_code, "451"),
110
+ self.handle_vercel_dot_app,
111
+ ],
101
112
  r"\.web\.app$": [(self.switch_to_down_if_status_code, 404)],
102
113
  r"\.wix\.com$": [(self.switch_to_down_if_status_code, 404)],
103
114
  r"^s3\.ap-south-1\.amazonaws\.com$": [
@@ -216,9 +227,7 @@ class ExtraRulesHandler(ExtraRuleHandlerBase):
216
227
  This method are assuming we are handling a imgur.com subdomain.
217
228
  """
218
229
 
219
- req = PyFunceble.factory.Requester.get(
220
- self.req_url_https, allow_redirects=False
221
- )
230
+ req = self.requester.get(self.req_url_https, allow_redirects=False)
222
231
  username = self.status.netloc.replace(".imgur.com", "")
223
232
 
224
233
  if "Location" in req.headers:
@@ -227,6 +236,56 @@ class ExtraRulesHandler(ExtraRuleHandlerBase):
227
236
 
228
237
  return self
229
238
 
239
+ def handle_vercel_dot_app(self) -> "ExtraRulesHandler":
240
+ """
241
+ Handles the :code:`vercel.app` case.
242
+
243
+ .. warning::
244
+ This method assume that we know that we are handling a vercel.app domain.
245
+ """
246
+
247
+ regex_vercel = [r"This%20Deployment%20has%20been%20disabled"]
248
+
249
+ self.do_on_header_match(
250
+ self.req_url,
251
+ {"x-vercel-error": ["DEPLOYMENT_DISABLED"]},
252
+ method=self.switch_to_down,
253
+ match_mode="std",
254
+ strict=True,
255
+ allow_redirects=False,
256
+ )
257
+
258
+ self.do_on_body_match(
259
+ self.req_url,
260
+ regex_vercel,
261
+ method=self.switch_to_down,
262
+ allow_redirects=False,
263
+ )
264
+
265
+ return self
266
+
267
+ def handle_squarespace_com(self) -> "ExtraRulesHandler":
268
+ """
269
+ Handles the :code:`wordpress.com` case.
270
+
271
+ .. warning::
272
+ This method assume that we know that we are handling a blogspot domain.
273
+ """
274
+
275
+ regex_squarespace = [
276
+ r"This site has been deleted"
277
+ r" by the owner\."
278
+ ]
279
+
280
+ self.do_on_body_match(
281
+ self.req_url,
282
+ regex_squarespace,
283
+ method=self.switch_to_down,
284
+ allow_redirects=True,
285
+ )
286
+
287
+ return self
288
+
230
289
  def __handle_active2inactive(self) -> "ExtraRulesHandler":
231
290
  """
232
291
  Handles the status deescalation.
@@ -146,7 +146,7 @@ class SubjectSwitchRulesHandler(ExtraRuleHandlerBase):
146
146
 
147
147
  if not self.status.status_after_extra_rules:
148
148
  self._switch_down_by_history()
149
- except PyFunceble.factory.Requester.exceptions.RequestException:
149
+ except self.requester.exceptions.RequestException:
150
150
  pass
151
151
 
152
152
  PyFunceble.facility.Logger.info(
@@ -51,7 +51,6 @@ License:
51
51
  """
52
52
 
53
53
  import PyFunceble.facility
54
- import PyFunceble.factory
55
54
  import PyFunceble.storage
56
55
  from PyFunceble.checker.availability.base import AvailabilityCheckerBase
57
56
  from PyFunceble.checker.reputation.ip import IPReputationChecker
@@ -51,7 +51,6 @@ License:
51
51
  """
52
52
 
53
53
  import PyFunceble.facility
54
- import PyFunceble.factory
55
54
  import PyFunceble.storage
56
55
  from PyFunceble.checker.availability.base import AvailabilityCheckerBase
57
56
  from PyFunceble.checker.availability.status import AvailabilityCheckerStatus
@@ -55,7 +55,6 @@ from typing import List, Optional
55
55
  from sqlalchemy.orm import Session
56
56
 
57
57
  import PyFunceble.facility
58
- import PyFunceble.factory
59
58
  import PyFunceble.storage
60
59
  from PyFunceble.checker.base import CheckerBase
61
60
  from PyFunceble.checker.reputation.params import ReputationCheckerParams
@@ -59,7 +59,6 @@ import PyFunceble.checker.utils.whois
59
59
  import PyFunceble.cli.utils.stdout
60
60
  import PyFunceble.cli.utils.testing
61
61
  import PyFunceble.facility
62
- import PyFunceble.factory
63
62
  import PyFunceble.storage
64
63
  from PyFunceble.cli.continuous_integration.base import ContinuousIntegrationBase
65
64
  from PyFunceble.cli.migrators.alembic import Alembic
@@ -62,7 +62,9 @@ import PyFunceble.cli.facility
62
62
  import PyFunceble.cli.factory
63
63
  import PyFunceble.facility
64
64
  import PyFunceble.sessions
65
+ import PyFunceble.storage
65
66
  from PyFunceble.cli.continuous_integration.base import ContinuousIntegrationBase
67
+ from PyFunceble.query.requests.requester import Requester
66
68
 
67
69
 
68
70
  class WorkerBase(multiprocessing.Process):
@@ -99,6 +101,7 @@ class WorkerBase(multiprocessing.Process):
99
101
  _exception: Optional[multiprocessing.Pipe] = None
100
102
 
101
103
  _params: Optional[dict] = {}
104
+ requester: Optional[Requester] = None
102
105
 
103
106
  def __init__(
104
107
  self,
@@ -149,6 +152,8 @@ class WorkerBase(multiprocessing.Process):
149
152
  A method which will be executed after the :code:`__init__` method.
150
153
  """
151
154
 
155
+ self.requester = Requester(config=PyFunceble.storage.CONFIGURATION)
156
+
152
157
  @property
153
158
  def exception(self):
154
159
  """
@@ -281,9 +286,6 @@ class WorkerBase(multiprocessing.Process):
281
286
  PyFunceble.cli.facility.CredentialLoader.start()
282
287
  PyFunceble.cli.factory.DBSession.init_db_sessions()
283
288
 
284
- # Be sure that all settings are loaded proprely!!
285
- PyFunceble.factory.Requester = PyFunceble.factory.requester()
286
-
287
289
  wait_for_stop = (
288
290
  bool(PyFunceble.storage.CONFIGURATION.cli_testing.mining) is True
289
291
  )
@@ -58,7 +58,6 @@ from typing import Any, List, Optional, Tuple
58
58
 
59
59
  import PyFunceble.cli.storage
60
60
  import PyFunceble.facility
61
- import PyFunceble.factory
62
61
  import PyFunceble.storage
63
62
  from PyFunceble.cli.processes.workers.file_sorter_base import FileSorterWorkerBase
64
63
 
@@ -54,7 +54,6 @@ from typing import Any, Optional, Tuple
54
54
 
55
55
  import PyFunceble.cli.storage
56
56
  import PyFunceble.facility
57
- import PyFunceble.factory
58
57
  import PyFunceble.storage
59
58
  from PyFunceble.cli.processes.workers.file_sorter_base import FileSorterWorkerBase
60
59
 
@@ -60,7 +60,6 @@ from typing import Any, Generator, List, Tuple
60
60
 
61
61
  import PyFunceble.cli.storage
62
62
  import PyFunceble.facility
63
- import PyFunceble.factory
64
63
  import PyFunceble.storage
65
64
  from PyFunceble.cli.filesystem.printer.file import FilePrinter
66
65
  from PyFunceble.cli.processes.workers.base import WorkerBase
@@ -53,7 +53,6 @@ License:
53
53
  import traceback
54
54
 
55
55
  import PyFunceble.facility
56
- import PyFunceble.factory
57
56
  import PyFunceble.storage
58
57
  from PyFunceble.cli.processes.workers.base import WorkerBase
59
58
 
@@ -57,7 +57,6 @@ from typing import List, Optional, Tuple
57
57
  from domain2idna import domain2idna
58
58
 
59
59
  import PyFunceble.facility
60
- import PyFunceble.factory
61
60
  import PyFunceble.storage
62
61
  from PyFunceble.checker.status_base import CheckerStatusBase
63
62
  from PyFunceble.cli.processes.workers.base import WorkerBase
@@ -86,8 +85,7 @@ class MinerWorker(WorkerBase):
86
85
 
87
86
  return super().__post_init__()
88
87
 
89
- @staticmethod
90
- def mine_from(subject: str) -> Optional[List[str]]:
88
+ def mine_from(self, subject: str) -> Optional[List[str]]:
91
89
  """
92
90
  Given the subject to work from, try to get the related subjects.
93
91
 
@@ -99,7 +97,7 @@ class MinerWorker(WorkerBase):
99
97
  result = []
100
98
 
101
99
  try:
102
- req = PyFunceble.factory.Requester.get(subject, allow_redirects=True)
100
+ req = self.requester.get(subject, allow_redirects=True)
103
101
 
104
102
  for element in req.history:
105
103
  if "location" in element.headers:
@@ -107,11 +105,11 @@ class MinerWorker(WorkerBase):
107
105
 
108
106
  result.extend([x for x in req.history if isinstance(x, str)])
109
107
  except (
110
- PyFunceble.factory.Requester.exceptions.RequestException,
111
- PyFunceble.factory.Requester.exceptions.ConnectionError,
112
- PyFunceble.factory.Requester.exceptions.Timeout,
113
- PyFunceble.factory.Requester.exceptions.InvalidURL,
114
- PyFunceble.factory.Requester.urllib3_exceptions.InvalidHeader,
108
+ self.requester.exceptions.RequestException,
109
+ self.requester.exceptions.ConnectionError,
110
+ self.requester.exceptions.Timeout,
111
+ self.requester.exceptions.InvalidURL,
112
+ self.requester.urllib3_exceptions.InvalidHeader,
115
113
  socket.timeout,
116
114
  ):
117
115
  PyFunceble.facility.Logger.error(
@@ -55,7 +55,6 @@ from typing import Any, Optional, Tuple
55
55
 
56
56
  import PyFunceble.cli.utils.testing
57
57
  import PyFunceble.facility
58
- import PyFunceble.factory
59
58
  from PyFunceble.checker.availability.domain_and_ip import DomainAndIPAvailabilityChecker
60
59
  from PyFunceble.checker.availability.url import URLAvailabilityChecker
61
60
  from PyFunceble.checker.base import CheckerBase
@@ -209,13 +208,10 @@ class TesterWorker(WorkerBase):
209
208
  queue.
210
209
  """
211
210
 
212
- if (
213
- PyFunceble.factory.Requester.session
214
- and "Connection" not in PyFunceble.factory.Requester.session.headers
215
- ):
211
+ if "Connection" not in self.requester.headers:
216
212
  # Just close the connection immediately. This prevent potential infinite
217
213
  # streams.
218
- PyFunceble.factory.Requester.session.headers["Connection"] = "close"
214
+ self.requester.session.headers["Connection"] = "close"
219
215
 
220
216
  if not isinstance(consumed, dict):
221
217
  PyFunceble.facility.Logger.debug(
@@ -54,6 +54,7 @@ import concurrent.futures
54
54
  from typing import Dict, Optional, Tuple
55
55
 
56
56
  import PyFunceble.facility
57
+ import PyFunceble.storage
57
58
  from PyFunceble.dataset.iana import IanaDataset
58
59
  from PyFunceble.helpers.dict import DictHelper
59
60
  from PyFunceble.helpers.download import DownloadHelper
@@ -265,7 +266,16 @@ class IanaDBGenerator:
265
266
  """
266
267
 
267
268
  raw_data = (
268
- DownloadHelper(self.UPSTREAM_LINK)
269
+ DownloadHelper(
270
+ self.UPSTREAM_LINK,
271
+ certificate_validation=(
272
+ PyFunceble.storage.CONFIGURATION.verify_ssl_certificate
273
+ if PyFunceble.storage.CONFIGURATION
274
+ else True
275
+ ),
276
+ own_proxy_handler=True,
277
+ proxies=PyFunceble.storage.PROXY,
278
+ )
269
279
  .download_text()
270
280
  .split('<span class="domain tld">')
271
281
  )
@@ -165,7 +165,20 @@ class PublicSuffixGenerator:
165
165
  Starts the generation of the dataset file.
166
166
  """
167
167
 
168
- raw_data = DownloadHelper(self.UPSTREAM_LINK).download_text().split("\n")
168
+ raw_data = (
169
+ DownloadHelper(
170
+ self.UPSTREAM_LINK,
171
+ certificate_validation=(
172
+ PyFunceble.storage.CONFIGURATION.verify_ssl_certificate
173
+ if PyFunceble.storage.CONFIGURATION
174
+ else True
175
+ ),
176
+ own_proxy_handler=True,
177
+ proxies=PyFunceble.storage.PROXY,
178
+ )
179
+ .download_text()
180
+ .split("\n")
181
+ )
169
182
 
170
183
  with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
171
184
  for result in executor.map(self.parse_line, raw_data):
@@ -455,7 +455,16 @@ class SystemLauncher(SystemBase):
455
455
  """
456
456
 
457
457
  if URLSyntaxChecker(file).is_valid():
458
- DownloadHelper(file).download_text(destination=destination)
458
+ DownloadHelper(
459
+ file,
460
+ certificate_validation=(
461
+ PyFunceble.storage.CONFIGURATION.verify_ssl_certificate
462
+ if PyFunceble.storage.CONFIGURATION
463
+ else True
464
+ ),
465
+ own_proxy_handler=True,
466
+ proxies=PyFunceble.storage.PROXY,
467
+ ).download_text(destination=destination)
459
468
  return True
460
469
  return False
461
470
 
@@ -651,18 +660,14 @@ class SystemLauncher(SystemBase):
651
660
 
652
661
  max_breakoff = 120.0
653
662
 
654
- initial_breakoff = (
655
- max_breakoff / PyFunceble.storage.CONFIGURATION.cli_testing.max_workers
656
- )
663
+ initial_breakoff = 0.1 * self.tester_process_manager.max_worker
657
664
  breakoff = initial_breakoff
658
665
 
659
666
  while True:
660
667
  protocol_data = {}
661
668
 
662
669
  for next_contract in next(
663
- query_tool.pull_contract(
664
- PyFunceble.storage.CONFIGURATION.cli_testing.max_workers
665
- )
670
+ query_tool.pull_contract(self.tester_process_manager.max_worker)
666
671
  ):
667
672
  if "subject" not in next_contract or not next_contract["subject"]:
668
673
  continue
@@ -684,16 +689,24 @@ class SystemLauncher(SystemBase):
684
689
 
685
690
  self.ci_stop_in_the_middle_if_time_exceeded()
686
691
 
687
- if PyFunceble.storage.CONFIGURATION.cli_testing.display_mode.dots:
688
- PyFunceble.cli.utils.stdout.print_single_line("S")
692
+ if (
693
+ self.tester_process_manager.input_queue.qsize()
694
+ >= self.tester_process_manager.max_worker
695
+ ):
696
+ breakoff_multiplier = (
697
+ self.tester_process_manager.input_queue.qsize() * 2
698
+ )
689
699
 
690
- if protocol_data:
691
- breakoff = initial_breakoff
692
- elif breakoff < max_breakoff:
693
- breakoff += 0.02
694
- else:
700
+ if breakoff < max_breakoff:
701
+ breakoff += 0.1 * breakoff_multiplier
702
+ else:
703
+ breakoff = initial_breakoff
704
+ elif breakoff >= max_breakoff:
695
705
  breakoff = initial_breakoff
696
706
 
707
+ if PyFunceble.storage.CONFIGURATION.cli_testing.display_mode.dots:
708
+ PyFunceble.cli.utils.stdout.print_single_line("S")
709
+
697
710
  time.sleep(breakoff)
698
711
 
699
712
  for protocol in self.testing_protocol:
@@ -55,6 +55,7 @@ import sys
55
55
  from datetime import datetime, timezone
56
56
 
57
57
  import colorama
58
+ import requests
58
59
  from box import Box
59
60
 
60
61
  import PyFunceble.cli.storage
@@ -72,14 +73,24 @@ def get_upstream_version() -> Box:
72
73
  Provides the state of the upstream version.
73
74
  """
74
75
 
76
+ try:
77
+ response = DownloadHelper(
78
+ InternalUrlConverter(
79
+ PyFunceble.cli.storage.VERSION_DUMP_LINK,
80
+ ).get_converted(),
81
+ own_proxy_handler=True,
82
+ proxies=PyFunceble.storage.PROXY,
83
+ certificate_validation=(
84
+ PyFunceble.storage.CONFIGURATION.verify_ssl_certificate
85
+ if PyFunceble.storage.CONFIGURATION
86
+ else True
87
+ ),
88
+ ).download_text()
89
+ except requests.exceptions.RequestException:
90
+ response = "{}"
91
+
75
92
  return Box(
76
- DictHelper().from_yaml(
77
- DownloadHelper(
78
- InternalUrlConverter(
79
- PyFunceble.cli.storage.VERSION_DUMP_LINK
80
- ).get_converted()
81
- ).download_text()
82
- ),
93
+ DictHelper().from_yaml(response),
83
94
  frozen_box=True,
84
95
  )
85
96
 
@@ -346,16 +357,17 @@ def print_central_messages(check_force_update: bool = False) -> None:
346
357
 
347
358
  upstream_version = get_upstream_version()
348
359
 
349
- if check_force_update:
350
- handle_force_update(upstream_version)
360
+ if upstream_version:
361
+ if check_force_update:
362
+ handle_force_update(upstream_version)
351
363
 
352
- _ = (
353
- not handle_deprecated_version(upstream_version)
354
- and not handle_greater_version(upstream_version)
355
- and not handle_older_version(upstream_version)
356
- )
364
+ _ = (
365
+ not handle_deprecated_version(upstream_version)
366
+ and not handle_greater_version(upstream_version)
367
+ and not handle_older_version(upstream_version)
368
+ )
357
369
 
358
- handle_messages(upstream_version)
370
+ handle_messages(upstream_version)
359
371
 
360
372
  prefix = " - " if len(PyFunceble.cli.storage.EXTRA_MESSAGES) > 1 else ""
361
373