modulitiz-micro 2.26.0__py311-none-any.whl → 2.27.0__py311-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 (102) hide show
  1. modulitiz_micro/ModuloBase64.py +61 -61
  2. modulitiz_micro/ModuloColorText.py +35 -35
  3. modulitiz_micro/ModuloDate.py +295 -295
  4. modulitiz_micro/ModuloFunzioni.py +58 -58
  5. modulitiz_micro/ModuloListe.py +150 -150
  6. modulitiz_micro/ModuloMeteo.py +72 -72
  7. modulitiz_micro/ModuloNumeri.py +130 -130
  8. modulitiz_micro/ModuloPyinstaller.py +29 -29
  9. modulitiz_micro/ModuloSeriale.py +61 -61
  10. modulitiz_micro/ModuloStatistiche.py +31 -31
  11. modulitiz_micro/ModuloStringhe.py +180 -180
  12. modulitiz_micro/ModuloTarghe.py +46 -46
  13. modulitiz_micro/android/ModuloAndroid.py +18 -18
  14. modulitiz_micro/android/ModuloAndroidAdb.py +48 -48
  15. modulitiz_micro/android/ModuloAndroidSim.py +130 -130
  16. modulitiz_micro/android/beans/SmsBean.py +12 -12
  17. modulitiz_micro/android/enums/AndroidSmsTypeEnum.py +17 -17
  18. modulitiz_micro/database/AbstractDatabaseService.py +13 -13
  19. modulitiz_micro/database/AbstractSql.py +49 -49
  20. modulitiz_micro/database/ModuloSqlOracle.py +19 -19
  21. modulitiz_micro/database/ModuloSqlServer.py +50 -50
  22. modulitiz_micro/database/eccezioni/EccezioneDbNoData.py +6 -6
  23. modulitiz_micro/database/mysql/AbstractBasicMysql.py +114 -114
  24. modulitiz_micro/database/mysql/ModuloMysql.py +151 -151
  25. modulitiz_micro/database/mysql/MysqlCommonConverter.py +47 -47
  26. modulitiz_micro/database/mysql/eccezioni/EccezioneMysqlOffline.py +6 -6
  27. modulitiz_micro/database/sqlite/AbstractBasicSQLite.py +114 -114
  28. modulitiz_micro/database/sqlite/ModuloSQLite.py +82 -82
  29. modulitiz_micro/eccezioni/EccezioneBase.py +7 -7
  30. modulitiz_micro/eccezioni/EccezioneCtrlC.py +7 -7
  31. modulitiz_micro/eccezioni/EccezioneRuntime.py +7 -7
  32. modulitiz_micro/eccezioni/EccezioneScheduler.py +7 -7
  33. modulitiz_micro/eccezioni/EccezioneSoNonSupportato.py +7 -7
  34. modulitiz_micro/eccezioni/http/EccezioneHttp.py +8 -8
  35. modulitiz_micro/eccezioni/http/EccezioneHttp404.py +7 -7
  36. modulitiz_micro/eccezioni/http/EccezioneHttpGeneric.py +7 -7
  37. modulitiz_micro/files/ModuloFiles.py +173 -173
  38. modulitiz_micro/files/ModuloLogging.py +69 -69
  39. modulitiz_micro/files/ModuloZip.py +42 -42
  40. modulitiz_micro/files/cache/CacheBean.py +5 -5
  41. modulitiz_micro/files/cache/CacheRam.py +29 -29
  42. modulitiz_micro/files/cache/DatabaseCache.py +91 -91
  43. modulitiz_micro/files/cache/decorators/cacheRam.py +26 -26
  44. modulitiz_micro/files/git/ModuloGit.py +15 -15
  45. modulitiz_micro/gestionedom/GestioneDom.py +44 -44
  46. modulitiz_micro/init/AbstractBasicInit.py +27 -27
  47. modulitiz_micro/init/AbstractInit.py +11 -11
  48. modulitiz_micro/keylogger/EccezioneKeyLogger.py +7 -7
  49. modulitiz_micro/keylogger/ModuloKeylogger.py +73 -73
  50. modulitiz_micro/multithreading/ModuloThread.py +26 -26
  51. modulitiz_micro/multithreading/ModuloThreadLogger.py +8 -8
  52. modulitiz_micro/multithreading/ModuloThreadWithCallbackError.py +25 -25
  53. modulitiz_micro/nlp/ModuloNlp.py +36 -36
  54. modulitiz_micro/nlp/ModuloNlpDateAndTime.py +59 -59
  55. modulitiz_micro/rete/ModuloNetworking.py +64 -64
  56. modulitiz_micro/rete/ModuloOpenVpn.py +15 -15
  57. modulitiz_micro/rete/email/EmailBean.py +5 -0
  58. modulitiz_micro/rete/{ModuloEmail.py → email/ModuloEmail.py} +90 -69
  59. modulitiz_micro/rete/http/ModuloHttp.py +114 -114
  60. modulitiz_micro/rete/http/ModuloHttpConnectionSafe.py +91 -91
  61. modulitiz_micro/rete/http/ModuloHttpUtils.py +66 -66
  62. modulitiz_micro/rete/http/beans/HttpResponseBean.py +5 -5
  63. modulitiz_micro/rete/http/decorators/catchAndRaiseHttpExceptions.py +22 -22
  64. modulitiz_micro/rete/ntp/AbstractModuloNtp.py +73 -73
  65. modulitiz_micro/rete/ntp/ModuloNtpIt.py +8 -8
  66. modulitiz_micro/rete/socketserver/AbstractBasicGetSocketServer.py +35 -35
  67. modulitiz_micro/rete/socketserver/AbstractSocketServer.py +267 -267
  68. modulitiz_micro/rete/ssl/ModuloSsl.py +56 -56
  69. modulitiz_micro/sistema/EnvVarsEnum.py +9 -9
  70. modulitiz_micro/sistema/ModuloEnvVars.py +34 -34
  71. modulitiz_micro/sistema/ModuloSystem.py +298 -298
  72. modulitiz_micro/sistema/ModuloSystemPipe.py +67 -67
  73. modulitiz_micro/social/telegram/ModuloTelegram.py +52 -52
  74. modulitiz_micro/social/telegram/ModuloTelegramSimple.py +26 -26
  75. modulitiz_micro/util/beans/conf/AbstractBasicConfBean.py +11 -11
  76. modulitiz_micro/util/beans/conf/AbstractConfBean.py +16 -16
  77. modulitiz_micro/util/beans/fileconf/AbstractBasicFileConfBean.py +11 -11
  78. modulitiz_micro/util/beans/fileconf/AbstractFileConfBean.py +13 -13
  79. modulitiz_micro/util/beans/globalvar/AbstractBasicGlobalVarBean.py +15 -15
  80. modulitiz_micro/util/beans/globalvar/AbstractGlobalVarBean.py +34 -34
  81. modulitiz_micro/util/decorators/noAwait.py +23 -23
  82. modulitiz_micro/util/pip/AbstractModuloPip.py +41 -41
  83. modulitiz_micro/util/pip/ModuloPip.py +49 -49
  84. modulitiz_micro/util/scheduler/AbstractScheduler.py +32 -32
  85. modulitiz_micro/util/spooler/AbstractSpooler.py +14 -14
  86. modulitiz_micro/util/spooler/Spooler.py +18 -18
  87. modulitiz_micro/util/spooler/beans/QueueBean.py +8 -8
  88. modulitiz_micro/util/spooler/decorators/spooler.py +49 -49
  89. modulitiz_micro/util/spooler/eccezioni/EccezioneSpooler.py +7 -7
  90. modulitiz_micro/util/spooler/eccezioni/EccezioneSpoolerFull.py +7 -7
  91. modulitiz_micro/util/unittesting/AbstractOverrideTestUtil.py +18 -18
  92. modulitiz_micro/util/unittesting/AbstractTestUtil.py +11 -11
  93. modulitiz_micro/util/unittesting/ModuloRunUnitTest.py +25 -25
  94. modulitiz_micro/util/wheel/ModuloBuildWheel.py +118 -118
  95. modulitiz_micro/util/wheel/ModuloToml.py +40 -40
  96. modulitiz_micro/util/wheel/ModuloWheel.py +12 -12
  97. {modulitiz_micro-2.26.0.dist-info → modulitiz_micro-2.27.0.dist-info}/LICENSE +20 -20
  98. {modulitiz_micro-2.26.0.dist-info → modulitiz_micro-2.27.0.dist-info}/METADATA +63 -63
  99. modulitiz_micro-2.27.0.dist-info/RECORD +101 -0
  100. modulitiz_micro-2.26.0.dist-info/RECORD +0 -100
  101. {modulitiz_micro-2.26.0.dist-info → modulitiz_micro-2.27.0.dist-info}/WHEEL +0 -0
  102. {modulitiz_micro-2.26.0.dist-info → modulitiz_micro-2.27.0.dist-info}/top_level.txt +0 -0
@@ -1,114 +1,114 @@
1
- import gzip
2
- import logging
3
- import ssl
4
- import urllib
5
- from urllib.parse import urlencode
6
- from urllib.request import Request
7
-
8
- import brotli
9
-
10
- from modulitiz_micro.ModuloBase64 import ModuloBase64
11
- from modulitiz_micro.ModuloStringhe import ModuloStringhe
12
- from modulitiz_micro.eccezioni.EccezioneRuntime import EccezioneRuntime
13
- from modulitiz_micro.files.ModuloLogging import ModuloLogging
14
- from modulitiz_micro.rete.http.ModuloHttpConnectionSafe import ModuloHttpConnectionSafe
15
- from modulitiz_micro.rete.http.beans.HttpResponseBean import HttpResponseBean
16
- from modulitiz_micro.rete.http.decorators.catchAndRaiseHttpExceptions import catchAndRaiseHttpExceptions
17
-
18
-
19
- class ModuloHttp(object):
20
- """
21
- Utility per gestione richieste di rete secondo il protocollo HTTP.
22
- """
23
-
24
- UA_ANDROID="Mozilla/5.0 (Linux; Android 12.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Mobile Safari/537.36"
25
-
26
- UA_MACOS_CHROME="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
27
- UA_WINDOWS_CHROME="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
28
- UA_WINDOWS_FIREFOX="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0"
29
-
30
- UAS=[UA_MACOS_CHROME,UA_WINDOWS_CHROME,UA_WINDOWS_FIREFOX]
31
-
32
- URL_CERCA_GOOGLE="https://www.google.it/search?q="
33
- URLS_GET_IP=('https://ipecho.net/plain','https://ipinfo.io/ip','https://api.ipify.org')
34
-
35
- REGEX_INDIRIZZO_IP=r"\b(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\b"
36
-
37
- STATUS_OK=200
38
- STATUS_OK_PARTIAL_CONTENT=206
39
-
40
-
41
- def __init__(self,url:str,logger:ModuloLogging|None,useProxy:bool=False):
42
- logging.getLogger("urllib3").propagate=False
43
-
44
- self.__requestObj=Request(url)
45
- self.__logger=logger
46
-
47
- self.setUserAgent(self.UA_WINDOWS_FIREFOX)
48
- self.addHeader('Accept-Encoding','gzip, deflate, br') # questo serve per ridurre la dimensione della risposta
49
- if useProxy is True:
50
- self.addHeader('Origin','localhost')
51
- self.connectionSafe=ModuloHttpConnectionSafe(self.__logger)
52
- self.postData=None
53
-
54
- def doGet(self,retries:int,ignoreCerts:bool=False)->HttpResponseBean:
55
- """
56
- Esegue una richiesta di tipo GET
57
- """
58
- if retries==0:
59
- return self.__getOrPost(True,ignoreCerts)
60
- return self.connectionSafe.run(retries,0,self.__getOrPost,True,ignoreCerts)
61
-
62
- def doPost(self, postData:dict, retries:int,ignoreCerts:bool=False)->HttpResponseBean:
63
- """
64
- Esegue una richiesta di tipo POST
65
- """
66
- self.postData=postData
67
- if retries==0:
68
- return self.__getOrPost(False,ignoreCerts)
69
- return self.connectionSafe.run(retries,0,self.__getOrPost,False,ignoreCerts)
70
-
71
- @catchAndRaiseHttpExceptions
72
- def __getOrPost(self, isGet:bool,ignoreCerts:bool)->HttpResponseBean:
73
- if not isGet:
74
- postData=urlencode(self.postData).encode()
75
- self.__requestObj.data=postData
76
- # ignoro certificati
77
- ctx=None
78
- if ignoreCerts:
79
- ctx=ssl.create_default_context()
80
- ctx.check_hostname=False
81
- ctx.verify_mode=ssl.CERT_NONE
82
- with urllib.request.urlopen(self.__requestObj,context=ctx) as response:
83
- responseBody=response.read()
84
- responseHeaders=response.info()
85
- status=response.status
86
- # se il server manda il contenuto in formato compresso lo decomprimo
87
- contentEncoding=responseHeaders.get('Content-Encoding')
88
- if contentEncoding=="gzip":
89
- responseBody=gzip.decompress(responseBody)
90
- elif contentEncoding=="br":
91
- responseBody=brotli.decompress(responseBody)
92
- elif contentEncoding is not None and contentEncoding!= "deflate":
93
- raise EccezioneRuntime("Codifica '"+contentEncoding+"' non gestita.")
94
- return HttpResponseBean(status,responseBody,responseHeaders)
95
-
96
- # opzioni aggiuntive
97
- def addHeader(self,nome:str,valore):
98
- if ModuloStringhe.isEmpty(valore):
99
- return
100
- self.__requestObj.add_header(nome,valore)
101
-
102
- def setUserAgent(self,userAgent:str=None):
103
- if ModuloStringhe.isEmpty(userAgent):
104
- userAgent=self.UA_ANDROID
105
- else:
106
- userAgent=userAgent.strip()
107
- self.addHeader('User-Agent',userAgent)
108
-
109
- def setDownloadRange(self,inizio:int,fine:int):
110
- self.addHeader('Range',"bytes="+str(inizio)+"-"+str(fine))
111
-
112
- def setAuthenticationBasic(self,username:str,password:str):
113
- authStr=ModuloBase64.codificaStr('%s:%s' % (username, password))
114
- self.addHeader('Authorization',"Basic "+authStr)
1
+ import gzip
2
+ import logging
3
+ import ssl
4
+ import urllib
5
+ from urllib.parse import urlencode
6
+ from urllib.request import Request
7
+
8
+ import brotli
9
+
10
+ from modulitiz_micro.ModuloBase64 import ModuloBase64
11
+ from modulitiz_micro.ModuloStringhe import ModuloStringhe
12
+ from modulitiz_micro.eccezioni.EccezioneRuntime import EccezioneRuntime
13
+ from modulitiz_micro.files.ModuloLogging import ModuloLogging
14
+ from modulitiz_micro.rete.http.ModuloHttpConnectionSafe import ModuloHttpConnectionSafe
15
+ from modulitiz_micro.rete.http.beans.HttpResponseBean import HttpResponseBean
16
+ from modulitiz_micro.rete.http.decorators.catchAndRaiseHttpExceptions import catchAndRaiseHttpExceptions
17
+
18
+
19
+ class ModuloHttp(object):
20
+ """
21
+ Utility per gestione richieste di rete secondo il protocollo HTTP.
22
+ """
23
+
24
+ UA_ANDROID="Mozilla/5.0 (Linux; Android 12.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Mobile Safari/537.36"
25
+
26
+ UA_MACOS_CHROME="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
27
+ UA_WINDOWS_CHROME="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
28
+ UA_WINDOWS_FIREFOX="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0"
29
+
30
+ UAS=[UA_MACOS_CHROME,UA_WINDOWS_CHROME,UA_WINDOWS_FIREFOX]
31
+
32
+ URL_CERCA_GOOGLE="https://www.google.it/search?q="
33
+ URLS_GET_IP=('https://ipecho.net/plain','https://ipinfo.io/ip','https://api.ipify.org')
34
+
35
+ REGEX_INDIRIZZO_IP=r"\b(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\b"
36
+
37
+ STATUS_OK=200
38
+ STATUS_OK_PARTIAL_CONTENT=206
39
+
40
+
41
+ def __init__(self,url:str,logger:ModuloLogging|None,useProxy:bool=False):
42
+ logging.getLogger("urllib3").propagate=False
43
+
44
+ self.__requestObj=Request(url)
45
+ self.__logger=logger
46
+
47
+ self.setUserAgent(self.UA_WINDOWS_FIREFOX)
48
+ self.addHeader('Accept-Encoding','gzip, deflate, br') # questo serve per ridurre la dimensione della risposta
49
+ if useProxy is True:
50
+ self.addHeader('Origin','localhost')
51
+ self.connectionSafe=ModuloHttpConnectionSafe(self.__logger)
52
+ self.postData=None
53
+
54
+ def doGet(self,retries:int,ignoreCerts:bool=False)->HttpResponseBean:
55
+ """
56
+ Esegue una richiesta di tipo GET
57
+ """
58
+ if retries==0:
59
+ return self.__getOrPost(True,ignoreCerts)
60
+ return self.connectionSafe.run(retries,0,self.__getOrPost,True,ignoreCerts)
61
+
62
+ def doPost(self, postData:dict, retries:int,ignoreCerts:bool=False)->HttpResponseBean:
63
+ """
64
+ Esegue una richiesta di tipo POST
65
+ """
66
+ self.postData=postData
67
+ if retries==0:
68
+ return self.__getOrPost(False,ignoreCerts)
69
+ return self.connectionSafe.run(retries,0,self.__getOrPost,False,ignoreCerts)
70
+
71
+ @catchAndRaiseHttpExceptions
72
+ def __getOrPost(self, isGet:bool,ignoreCerts:bool)->HttpResponseBean:
73
+ if not isGet:
74
+ postData=urlencode(self.postData).encode()
75
+ self.__requestObj.data=postData
76
+ # ignoro certificati
77
+ ctx=None
78
+ if ignoreCerts:
79
+ ctx=ssl.create_default_context()
80
+ ctx.check_hostname=False
81
+ ctx.verify_mode=ssl.CERT_NONE
82
+ with urllib.request.urlopen(self.__requestObj,context=ctx) as response:
83
+ responseBody=response.read()
84
+ responseHeaders=response.info()
85
+ status=response.status
86
+ # se il server manda il contenuto in formato compresso lo decomprimo
87
+ contentEncoding=responseHeaders.get('Content-Encoding')
88
+ if contentEncoding=="gzip":
89
+ responseBody=gzip.decompress(responseBody)
90
+ elif contentEncoding=="br":
91
+ responseBody=brotli.decompress(responseBody)
92
+ elif contentEncoding is not None and contentEncoding!= "deflate":
93
+ raise EccezioneRuntime("Codifica '"+contentEncoding+"' non gestita.")
94
+ return HttpResponseBean(status,responseBody,responseHeaders)
95
+
96
+ # opzioni aggiuntive
97
+ def addHeader(self,nome:str,valore):
98
+ if ModuloStringhe.isEmpty(valore):
99
+ return
100
+ self.__requestObj.add_header(nome,valore)
101
+
102
+ def setUserAgent(self,userAgent:str=None):
103
+ if ModuloStringhe.isEmpty(userAgent):
104
+ userAgent=self.UA_ANDROID
105
+ else:
106
+ userAgent=userAgent.strip()
107
+ self.addHeader('User-Agent',userAgent)
108
+
109
+ def setDownloadRange(self,inizio:int,fine:int):
110
+ self.addHeader('Range',"bytes="+str(inizio)+"-"+str(fine))
111
+
112
+ def setAuthenticationBasic(self,username:str,password:str):
113
+ authStr=ModuloBase64.codificaStr('%s:%s' % (username, password))
114
+ self.addHeader('Authorization',"Basic "+authStr)
@@ -1,91 +1,91 @@
1
- import socket
2
- import time
3
- from urllib.error import URLError
4
-
5
- import requests
6
-
7
- from modulitiz_micro.ModuloFunzioni import ModuloFunzioni
8
- from modulitiz_micro.ModuloStringhe import ModuloStringhe
9
- from modulitiz_micro.eccezioni.http.EccezioneHttpGeneric import EccezioneHttpGeneric
10
- from modulitiz_micro.files.ModuloLogging import ModuloLogging
11
-
12
-
13
- class ModuloHttpConnectionSafe(object):
14
- """
15
- Utility che serve per gestire eventuali errori di rete e riprova a fare la richiesta in caso di errore
16
- """
17
-
18
- def __init__(self,logger: ModuloLogging|None):
19
- self.__logger=logger
20
-
21
- self.isLoggerEnabled=self.__logger is not None
22
- self.contaTentativi=0
23
- self.nomeFunzChiamanti=[]
24
- self.msgFunzChiamanti=None
25
-
26
- def run(self, retries:int,retriesBeforeNotify: int, funzione, *args,**kwargs):
27
- """
28
- se 'retries' e' = -1 allora continua a provare all'infinito
29
- se 'retriesBeforeNotify' e' = 0 allora in caso di errore di rete notifica subito
30
- """
31
- ritorno = None
32
- while self._buildIf(self.contaTentativi,retries):
33
- try:
34
- ritorno = funzione(*args,**kwargs)
35
- self.contaTentativi = -1
36
- except (EccezioneHttpGeneric,ConnectionError, TimeoutError, URLError,
37
- requests.exceptions.ConnectionError, socket.gaierror) as ex:
38
- # controllo il tipo di errore
39
- ModuloHttpConnectionSafe.__checkCodeExc(ex)
40
- # gestisco l'assenza di connessione
41
- self.contaTentativi += 1
42
- # scrivo un messaggio di avviso
43
- if retriesBeforeNotify == 0 or self.contaTentativi >= retriesBeforeNotify:
44
- self.__buildMsgAndNotify()
45
- ModuloHttpConnectionSafe.__dynamicPauseOrRaiseExc(self.contaTentativi, ex)
46
- self.contaTentativi=0
47
- self.nomeFunzChiamanti.clear()
48
- return ritorno
49
-
50
- @staticmethod
51
- def _buildIf(contaTentativi:int,retries:int)->bool:
52
- return contaTentativi >= 0 and (retries==-1 or contaTentativi<retries)
53
-
54
- def __buildMsgAndNotify(self):
55
- if not self.nomeFunzChiamanti:
56
- self.msgFunzChiamanti="Errore di connessione nella funzione "+ModuloFunzioni.getFunctionName(1)+"()"
57
- i=0
58
- while -1<i<2:
59
- nomeFunz = ModuloFunzioni.getFunctionName(i+2)
60
- if not ModuloStringhe.isEmpty(nomeFunz):
61
- self.msgFunzChiamanti += f", chiamata da {nomeFunz}()"
62
- i+=1
63
- else:
64
- i=-1
65
- msg=self.msgFunzChiamanti+f"; tentativo numero: {self.contaTentativi}"
66
- if self.isLoggerEnabled:
67
- self.__logger.error(msg)
68
- else:
69
- print(msg)
70
-
71
- @staticmethod
72
- def __checkCodeExc(ex: Exception):
73
- try:
74
- codiceErrore = ex.code
75
- except AttributeError:
76
- codiceErrore = 0
77
- if codiceErrore in (404, 500):
78
- raise ex
79
-
80
- @staticmethod
81
- def __dynamicPauseOrRaiseExc(contaTentativi: int, ex: Exception):
82
- if 0 < contaTentativi <= 20:
83
- time.sleep(10)
84
- elif 20 < contaTentativi <= 30:
85
- time.sleep(60)
86
- elif 20 < contaTentativi <= 50:
87
- time.sleep(60 * 2)
88
- elif 50 < contaTentativi <= 100:
89
- time.sleep(60 * 5)
90
- else:
91
- raise ex
1
+ import socket
2
+ import time
3
+ from urllib.error import URLError
4
+
5
+ import requests
6
+
7
+ from modulitiz_micro.ModuloFunzioni import ModuloFunzioni
8
+ from modulitiz_micro.ModuloStringhe import ModuloStringhe
9
+ from modulitiz_micro.eccezioni.http.EccezioneHttpGeneric import EccezioneHttpGeneric
10
+ from modulitiz_micro.files.ModuloLogging import ModuloLogging
11
+
12
+
13
+ class ModuloHttpConnectionSafe(object):
14
+ """
15
+ Utility che serve per gestire eventuali errori di rete e riprova a fare la richiesta in caso di errore
16
+ """
17
+
18
+ def __init__(self,logger: ModuloLogging|None):
19
+ self.__logger=logger
20
+
21
+ self.isLoggerEnabled=self.__logger is not None
22
+ self.contaTentativi=0
23
+ self.nomeFunzChiamanti=[]
24
+ self.msgFunzChiamanti=None
25
+
26
+ def run(self, retries:int,retriesBeforeNotify: int, funzione, *args,**kwargs):
27
+ """
28
+ se 'retries' e' = -1 allora continua a provare all'infinito
29
+ se 'retriesBeforeNotify' e' = 0 allora in caso di errore di rete notifica subito
30
+ """
31
+ ritorno = None
32
+ while self._buildIf(self.contaTentativi,retries):
33
+ try:
34
+ ritorno = funzione(*args,**kwargs)
35
+ self.contaTentativi = -1
36
+ except (EccezioneHttpGeneric,ConnectionError, TimeoutError, URLError,
37
+ requests.exceptions.ConnectionError, socket.gaierror) as ex:
38
+ # controllo il tipo di errore
39
+ ModuloHttpConnectionSafe.__checkCodeExc(ex)
40
+ # gestisco l'assenza di connessione
41
+ self.contaTentativi += 1
42
+ # scrivo un messaggio di avviso
43
+ if retriesBeforeNotify == 0 or self.contaTentativi >= retriesBeforeNotify:
44
+ self.__buildMsgAndNotify()
45
+ ModuloHttpConnectionSafe.__dynamicPauseOrRaiseExc(self.contaTentativi, ex)
46
+ self.contaTentativi=0
47
+ self.nomeFunzChiamanti.clear()
48
+ return ritorno
49
+
50
+ @staticmethod
51
+ def _buildIf(contaTentativi:int,retries:int)->bool:
52
+ return contaTentativi >= 0 and (retries==-1 or contaTentativi<retries)
53
+
54
+ def __buildMsgAndNotify(self):
55
+ if not self.nomeFunzChiamanti:
56
+ self.msgFunzChiamanti="Errore di connessione nella funzione "+ModuloFunzioni.getFunctionName(1)+"()"
57
+ i=0
58
+ while -1<i<2:
59
+ nomeFunz = ModuloFunzioni.getFunctionName(i+2)
60
+ if not ModuloStringhe.isEmpty(nomeFunz):
61
+ self.msgFunzChiamanti += f", chiamata da {nomeFunz}()"
62
+ i+=1
63
+ else:
64
+ i=-1
65
+ msg=self.msgFunzChiamanti+f"; tentativo numero: {self.contaTentativi}"
66
+ if self.isLoggerEnabled:
67
+ self.__logger.error(msg)
68
+ else:
69
+ print(msg)
70
+
71
+ @staticmethod
72
+ def __checkCodeExc(ex: Exception):
73
+ try:
74
+ codiceErrore = ex.code
75
+ except AttributeError:
76
+ codiceErrore = 0
77
+ if codiceErrore in (404, 500):
78
+ raise ex
79
+
80
+ @staticmethod
81
+ def __dynamicPauseOrRaiseExc(contaTentativi: int, ex: Exception):
82
+ if 0 < contaTentativi <= 20:
83
+ time.sleep(10)
84
+ elif 20 < contaTentativi <= 30:
85
+ time.sleep(60)
86
+ elif 20 < contaTentativi <= 50:
87
+ time.sleep(60 * 2)
88
+ elif 50 < contaTentativi <= 100:
89
+ time.sleep(60 * 5)
90
+ else:
91
+ raise ex
@@ -1,66 +1,66 @@
1
- import json
2
- import random
3
- from urllib.parse import quote_plus
4
- from urllib.parse import unquote_plus
5
-
6
- import requests
7
-
8
- from modulitiz_micro.ModuloStringhe import ModuloStringhe
9
- from modulitiz_micro.eccezioni.http.EccezioneHttpGeneric import EccezioneHttpGeneric
10
- from modulitiz_micro.files.ModuloLogging import ModuloLogging
11
- from modulitiz_micro.rete.http.ModuloHttp import ModuloHttp
12
- from modulitiz_micro.rete.http.ModuloHttpConnectionSafe import ModuloHttpConnectionSafe
13
- from modulitiz_micro.rete.http.decorators.catchAndRaiseHttpExceptions import catchAndRaiseHttpExceptions
14
-
15
-
16
- class ModuloHttpUtils(object):
17
- @staticmethod
18
- def isUrlAvailable(logger:ModuloLogging|None,url:str,retries:int,ignoreCerts:bool=False) -> bool:
19
- if retries!=0:
20
- connectionSafe=ModuloHttpConnectionSafe(logger)
21
- return connectionSafe.run(retries,0,ModuloHttpUtils.__isUrlAvailable,url,ignoreCerts)
22
- try:
23
- return ModuloHttpUtils.__isUrlAvailable(url,ignoreCerts)
24
- except EccezioneHttpGeneric:
25
- return False
26
-
27
- @staticmethod
28
- @catchAndRaiseHttpExceptions
29
- def __isUrlAvailable(url:str,ignoreCerts:bool) -> bool:
30
- with requests.get(url,stream=True,verify=(not ignoreCerts)) as response:
31
- return response.status_code==ModuloHttp.STATUS_OK
32
-
33
- @staticmethod
34
- def getIp() -> str|None:
35
- url=random.choice(ModuloHttp.URLS_GET_IP)
36
- http=ModuloHttp(url,None)
37
- try:
38
- response=http.doGet(2,False)
39
- except EccezioneHttpGeneric:
40
- return None
41
- if response is None:
42
- return None
43
- return response.responseBody.decode(ModuloStringhe.CODIFICA_UTF8)
44
-
45
- @classmethod
46
- def translate(cls,langFrom:str|None,langTo:str,msg:str) -> str|None:
47
- if langFrom is None:
48
- langFrom="auto"
49
- msg=cls.encodeUrl(msg)
50
- url=f'https://translate.googleapis.com/translate_a/single?client=gtx&sl={langFrom}&tl={langTo}&dt=t&q={msg}'
51
- http=ModuloHttp(url,None)
52
- try:
53
- response=http.doGet(3,False)
54
- except EccezioneHttpGeneric:
55
- return None
56
- responseText=response.responseBody.decode(ModuloStringhe.CODIFICA_UTF8)
57
- result=json.loads(responseText)
58
- output="".join(x[0] for x in result[0])
59
- return output
60
-
61
- @staticmethod
62
- def encodeUrl(url: str) -> str:
63
- return quote_plus(url)
64
- @staticmethod
65
- def decodeUrl(url: str) -> str:
66
- return unquote_plus(url)
1
+ import json
2
+ import random
3
+ from urllib.parse import quote_plus
4
+ from urllib.parse import unquote_plus
5
+
6
+ import requests
7
+
8
+ from modulitiz_micro.ModuloStringhe import ModuloStringhe
9
+ from modulitiz_micro.eccezioni.http.EccezioneHttpGeneric import EccezioneHttpGeneric
10
+ from modulitiz_micro.files.ModuloLogging import ModuloLogging
11
+ from modulitiz_micro.rete.http.ModuloHttp import ModuloHttp
12
+ from modulitiz_micro.rete.http.ModuloHttpConnectionSafe import ModuloHttpConnectionSafe
13
+ from modulitiz_micro.rete.http.decorators.catchAndRaiseHttpExceptions import catchAndRaiseHttpExceptions
14
+
15
+
16
+ class ModuloHttpUtils(object):
17
+ @staticmethod
18
+ def isUrlAvailable(logger:ModuloLogging|None,url:str,retries:int,ignoreCerts:bool=False) -> bool:
19
+ if retries!=0:
20
+ connectionSafe=ModuloHttpConnectionSafe(logger)
21
+ return connectionSafe.run(retries,0,ModuloHttpUtils.__isUrlAvailable,url,ignoreCerts)
22
+ try:
23
+ return ModuloHttpUtils.__isUrlAvailable(url,ignoreCerts)
24
+ except EccezioneHttpGeneric:
25
+ return False
26
+
27
+ @staticmethod
28
+ @catchAndRaiseHttpExceptions
29
+ def __isUrlAvailable(url:str,ignoreCerts:bool) -> bool:
30
+ with requests.get(url,stream=True,verify=(not ignoreCerts)) as response:
31
+ return response.status_code==ModuloHttp.STATUS_OK
32
+
33
+ @staticmethod
34
+ def getIp() -> str|None:
35
+ url=random.choice(ModuloHttp.URLS_GET_IP)
36
+ http=ModuloHttp(url,None)
37
+ try:
38
+ response=http.doGet(2,False)
39
+ except EccezioneHttpGeneric:
40
+ return None
41
+ if response is None:
42
+ return None
43
+ return response.responseBody.decode(ModuloStringhe.CODIFICA_UTF8)
44
+
45
+ @classmethod
46
+ def translate(cls,langFrom:str|None,langTo:str,msg:str) -> str|None:
47
+ if langFrom is None:
48
+ langFrom="auto"
49
+ msg=cls.encodeUrl(msg)
50
+ url=f'https://translate.googleapis.com/translate_a/single?client=gtx&sl={langFrom}&tl={langTo}&dt=t&q={msg}'
51
+ http=ModuloHttp(url,None)
52
+ try:
53
+ response=http.doGet(3,False)
54
+ except EccezioneHttpGeneric:
55
+ return None
56
+ responseText=response.responseBody.decode(ModuloStringhe.CODIFICA_UTF8)
57
+ result=json.loads(responseText)
58
+ output="".join(x[0] for x in result[0])
59
+ return output
60
+
61
+ @staticmethod
62
+ def encodeUrl(url: str) -> str:
63
+ return quote_plus(url)
64
+ @staticmethod
65
+ def decodeUrl(url: str) -> str:
66
+ return unquote_plus(url)
@@ -1,5 +1,5 @@
1
- class HttpResponseBean(object):
2
- def __init__(self,status:int,responseBody:bytes,responseHeaders:dict):
3
- self.status=status
4
- self.responseBody=responseBody
5
- self.responseHeaders=responseHeaders
1
+ class HttpResponseBean(object):
2
+ def __init__(self,status:int,responseBody:bytes,responseHeaders:dict):
3
+ self.status=status
4
+ self.responseBody=responseBody
5
+ self.responseHeaders=responseHeaders
@@ -1,22 +1,22 @@
1
- import socket
2
- from functools import wraps
3
- from urllib.error import URLError
4
-
5
- import requests
6
-
7
- from modulitiz_micro.eccezioni.http.EccezioneHttpGeneric import EccezioneHttpGeneric
8
-
9
-
10
- def catchAndRaiseHttpExceptions(funzione):
11
- """
12
- Cattura tutte le eccezioni http di vario tipo e rilancia un'eccezione custom
13
- """
14
-
15
- @wraps(funzione)
16
- def wrapped(*args,**kwargs):
17
- try:
18
- return funzione(*args,**kwargs)
19
- except (ConnectionError,TimeoutError,URLError,
20
- requests.exceptions.ConnectionError,socket.gaierror) as ex:
21
- raise EccezioneHttpGeneric() from ex
22
- return wrapped
1
+ import socket
2
+ from functools import wraps
3
+ from urllib.error import URLError
4
+
5
+ import requests
6
+
7
+ from modulitiz_micro.eccezioni.http.EccezioneHttpGeneric import EccezioneHttpGeneric
8
+
9
+
10
+ def catchAndRaiseHttpExceptions(funzione):
11
+ """
12
+ Cattura tutte le eccezioni http di vario tipo e rilancia un'eccezione custom
13
+ """
14
+
15
+ @wraps(funzione)
16
+ def wrapped(*args,**kwargs):
17
+ try:
18
+ return funzione(*args,**kwargs)
19
+ except (ConnectionError,TimeoutError,URLError,
20
+ requests.exceptions.ConnectionError,socket.gaierror) as ex:
21
+ raise EccezioneHttpGeneric() from ex
22
+ return wrapped