CustomRequestHelper¶
-
class
labpyproject.core.net.custom_TCP.
CustomRequestHelper
[source]¶ Bases :
object
Utilitaire statique proposant des services :
de support de codes et arguments de commandes
de découpage, indexation, envoi et réception de requêtes
d’analyse d’erreurs
Attributes Summary
demande d’id unique de client
marqueur de début de bloc
marqueur de fin de bloc
Taille de buffer par défaut considérée pour les requêtes
le client est connecté au serveur
le serveur se déconnecte mais ne s’arrête pas totalement
le client va s’arrêter
tag un msg comme confirmation de réception
nombre max de tentatives successives de connection
connection refusée par le serveur
erreur de type connection
erreur de donnée
dict de qualification des erreurs
erreur de type réseau
erreur d’envoi
erreur de type système
nombre d’erreurs à partir duquel on considère une connection comme probablement inactive
incrément d’uid de messages
indique que le message nécessite un accusé de réception
vérification de connection
délai avant tentative de re connection
time out de reconnection (par défaut 120 sec, on le réduit)
Création et compilation de la regex d’interprétation des commandes
Création et compilation de la regex des identifiants uniques de messages
délai avant nouvelle tentative d’envoi
Timeout select
nombre max de tentatives d’envoi
le serveur est connecté
le serveur se déconnecte mais ne s’arrête pas totalement
le serveur va s’arrêter
indique les données de connexion à client.socket_read
connection active
arrêt temporaire
erreur
connection refusée par le serveur
arrêt définiif
probablement en erreur
pour informer BUS/externalHandler de l’affectation
Methods Summary
create_cmd_msg
(code[, kwargs])Formate un message de commande client/serveur.
Génère le dictionnaire non renseigné destiné à retenir les données d’une requête reçue.
create_indexed_request
(msg, uid)Indexe, découpe au besoin la chaine msg envoyée par l’objet d’id uid.
create_test_msg
([confirmrecept, latin1])Crée un message de test d’une longueur > buffsize pour forcer l’envoi de plusieurs blocs
get_ip
()Retourne l’ip primaire, à la différence de socket.gethostbyname(socket.gethostname()) qui retourne plus systématiquement 127.0.x.1
is_error_fatal
(error)Indique si l’erreur reçue est fatale ou bien si l’on peut ré essayer l’action tentée.
mark_msg_as_unique
(asker, msg)Ajoute un identifiant unique de message à msg :
prefix_msg_with_code
(msg, code[, kwargs])Préfixe le msg avec un entête de commande.
receive_indexed_request
(sock)Prend en charge la réception sur la socket sock d’une série de requètes indéxées associées à un message.
send_indexed_request
(sock, bytesblocs)Prend en charge l’envoi via la socket sock de la liste de blocs binaires listbyteblocs.
split_cmd_and_msg
(msg)Sépare code de commande, dict d’arguments et fin du message dans un message parsé.
Sépare identifiants unique de message et message initial.
Attributes Documentation
-
ASK_FOR_UID
= 'ASK_FOR_UID'¶ demande d’id unique de client
-
BLOC_PREFIX
= '<#bp#>'¶ marqueur de début de bloc
-
BLOC_SUFFIX
= '<#bs#>'¶ marqueur de fin de bloc
-
BUFFERSIZE
= 2048¶ Taille de buffer par défaut considérée pour les requêtes
-
CLIENT_CONNECTED
= 'CLIENT_CONNECTED'¶ le client est connecté au serveur
-
CLIENT_DISCONNECTED
= 'CLIENT_DISCONNECTED'¶ le serveur se déconnecte mais ne s’arrête pas totalement
-
CLIENT_SHUTDOWN
= 'CLIENT_SHUTDOWN'¶ le client va s’arrêter
-
CONFIRM_RECEPTION
= 'CONFIRM_RECEPTION'¶ tag un msg comme confirmation de réception
-
CONNECTION_MAX_COUNT
= 10¶ nombre max de tentatives successives de connection
-
CONNECTION_REFUSED
= 'CONNECTION_REFUSED'¶ connection refusée par le serveur
-
ERRNO_CON
= 'ERRNO_CON'¶ erreur de type connection
-
ERRNO_DATA
= 'ERRNO_DATA'¶ erreur de donnée
-
ERRNO_DICT
= {1: {'desc': 'Operation not permitted', 'errno-str': 'EPERM', 'fatal': True, 'os': 'linux, windows', 'type': 'ERRNO_SYS'}, 4: {'desc': 'Interrupted system call', 'errno-str': 'EINTR', 'fatal': False, 'os': 'linux, windows', 'type': 'ERRNO_SYS'}, 5: {'desc': 'I/O error', 'errno-str': 'EIO', 'fatal': True, 'os': 'linux, windows', 'type': 'ERRNO_SYS'}, 6: {'desc': 'No such device or address', 'errno-str': 'ENXIO', 'fatal': True, 'os': 'linux, windows', 'type': 'ERRNO_CON'}, 10: {'desc': 'No child processes', 'errno-str': 'ECHILD', 'fatal': True, 'os': 'linux, windows', 'type': 'ERRNO_SYS'}, 11: {'desc': 'Try again', 'errno-str': 'EAGAIN', 'fatal': False, 'os': 'linux, windows', 'type': 'ERRNO_SYS'}, 12: {'desc': 'Out of memory', 'errno-str': 'ENOMEM', 'fatal': False, 'os': 'linux, windows', 'type': 'ERRNO_SYS'}, 13: {'desc': 'Permission denied', 'errno-str': 'EACCES', 'fatal': True, 'os': 'linux, windows', 'type': 'ERRNO_SYS'}, 14: {'desc': 'Bad address', 'errno-str': 'EFAULT', 'fatal': True, 'os': 'linux, windows', 'type': 'ERRNO_CON'}, 32: {'desc': 'Broken pipe', 'errno-str': 'EPIPE', 'fatal': True, 'os': 'linux, windows', 'type': 'ERRNO_CON'}, 53: {'desc': 'Invalid request descriptor', 'errno-str': 'EBADR', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_CON'}, 56: {'desc': 'Invalid request code', 'errno-str': 'EBADRQC', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_CON'}, 61: {'desc': 'No data available', 'errno-str': 'ENODATA', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_DATA'}, 62: {'desc': 'Timer expired', 'errno-str': 'ETIME', 'fatal': False, 'os': 'linux', 'type': 'ERRNO_SYS'}, 64: {'desc': 'Machine is not on the network', 'errno-str': 'ENONET', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_NET'}, 70: {'desc': 'Communication error on send', 'errno-str': 'ECOMM', 'fatal': False, 'os': 'linux', 'type': 'ERRNO_SEND'}, 71: {'desc': 'Protocol error', 'errno-str': 'EPROTO', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_NET'}, 76: {'desc': 'Name not unique on network', 'errno-str': 'ENOTUNIQ', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_NET'}, 77: {'desc': 'File descriptor in bad state', 'errno-str': 'EBADFD', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_CON'}, 78: {'desc': 'Remote address changed', 'errno-str': 'EREMCHG', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_CON'}, 85: {'desc': 'Interrupted system call should be restarted', 'errno-str': 'ERESTART', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_SYS'}, 86: {'desc': 'Streams pipe error', 'errno-str': 'ESTRPIPE', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_CON'}, 87: {'desc': 'Too many users', 'errno-str': 'EUSERS', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_SYS'}, 88: {'desc': 'Socket operation on non-socket', 'errno-str': 'ENOTSOCK', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_CON'}, 89: {'desc': 'Destination address required', 'errno-str': 'EDESTADDRREQ', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_CON'}, 90: {'desc': 'Message too long', 'errno-str': 'EMSGSIZE', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_DATA'}, 91: {'desc': 'Protocol wrong type for socket', 'errno-str': 'EPROTOTYPE', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_CON'}, 92: {'desc': 'Protocol not available', 'errno-str': 'ENOPROTOOPT', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_CON'}, 93: {'desc': 'Protocol not supported', 'errno-str': 'EPROTONOSUPPORT', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_CON'}, 94: {'desc': 'Socket type not supported', 'errno-str': 'ESOCKTNOSUPPORT', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_CON'}, 96: {'desc': 'Protocol family not supported', 'errno-str': 'EPFNOSUPPORT', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_CON'}, 97: {'desc': 'Address family not supported by protocol', 'errno-str': 'EAFNOSUPPORT', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_CON'}, 98: {'desc': 'Address already in use', 'errno-str': 'EADDRINUSE', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_CON'}, 100: {'desc': 'Network is down', 'errno-str': 'ENETDOWN', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_NET'}, 101: {'desc': 'Network is unreachable', 'errno-str': 'ENETUNREACH', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_NET'}, 102: {'desc': 'Network dropped connection because of reset', 'errno-str': 'ENETRESET', 'fatal': False, 'os': 'linux', 'type': 'ERRNO_NET'}, 103: {'desc': 'Software caused connection abort', 'errno-str': 'ECONNABORTED', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_CON'}, 104: {'desc': 'Connection reset by peer', 'errno-str': 'ECONNRESET', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_CON'}, 105: {'desc': 'No buffer space available', 'errno-str': 'ENOBUFS', 'fatal': False, 'os': 'linux', 'type': 'ERRNO_CON'}, 106: {'desc': 'Transport endpoint is already connected', 'errno-str': 'EISCONN', 'fatal': False, 'os': 'linux', 'type': 'ERRNO_CON'}, 107: {'desc': 'Transport endpoint is not connected', 'errno-str': 'ENOTCONN', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_CON'}, 108: {'desc': 'Cannot send after transport endpoint shutdown', 'errno-str': 'ESHUTDOWN', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_CON'}, 110: {'desc': 'Connection timed out', 'errno-str': 'ETIMEDOUT', 'fatal': False, 'os': 'linux', 'type': 'ERRNO_CON'}, 111: {'desc': 'Connection refused', 'errno-str': 'ECONNREFUSED', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_CON'}, 112: {'desc': 'Host is down', 'errno-str': 'EHOSTDOWN', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_NET'}, 113: {'desc': 'No route to host', 'errno-str': 'EHOSTUNREACH', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_SYS'}, 114: {'desc': 'Operation already in progress', 'errno-str': 'EALREADY', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_SYS'}, 115: {'desc': 'Operation now in progress', 'errno-str': 'EINPROGRESS', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_SYS'}, 120: {'desc': 'No data available', 'errno-str': 'ENODATA', 'fatal': True, 'os': 'windows', 'type': 'ERRNO_DATA'}, 121: {'desc': 'Remote I/O error', 'errno-str': 'EREMOTEIO', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_SYS'}, 122: {'desc': 'Quota exceeded', 'errno-str': 'EDQUOT', 'fatal': True, 'os': 'linux', 'type': 'ERRNO_SYS'}, 134: {'desc': 'Protocol error', 'errno-str': 'EPROTO', 'fatal': True, 'os': 'windows', 'type': 'ERRNO_NET'}, 137: {'desc': 'Timer expired', 'errno-str': 'ETIME', 'fatal': False, 'os': 'windows', 'type': 'ERRNO_SYS'}, 10004: {'desc': 'Interrupted system call', 'errno-str': 'WSAEINTR', 'fatal': False, 'os': 'windows', 'type': 'ERRNO_SYS'}, 10013: {'desc': 'Permission denied', 'errno-str': 'WSAEACCES', 'fatal': True, 'os': 'windows', 'type': 'ERRNO_SYS'}, 10014: {'desc': 'Bad address', 'errno-str': 'WSAEFAULT', 'fatal': True, 'os': 'windows', 'type': 'ERRNO_CON'}, 10036: {'desc': 'Operation now in progress', 'errno-str': 'WSAEINPROGRESS', 'fatal': True, 'os': 'windows', 'type': 'ERRNO_SYS'}, 10037: {'desc': 'Operation already in progress', 'errno-str': 'WSAEALREADY', 'fatal': True, 'os': 'windows', 'type': 'ERRNO_SYS'}, 10038: {'desc': 'Socket operation on non-socket', 'errno-str': 'WSAENOTSOCK', 'fatal': True, 'os': 'windows', 'type': 'ERRNO_CON'}, 10039: {'desc': 'Destination address required', 'errno-str': 'WSAEDESTADDRREQ', 'fatal': True, 'os': 'windows', 'type': 'ERRNO_CON'}, 10040: {'desc': 'Message too long', 'errno-str': 'WSAEMSGSIZE', 'fatal': True, 'os': 'windows', 'type': 'ERRNO_DATA'}, 10041: {'desc': 'Protocol wrong type for socket', 'errno-str': 'WSAEPROTOTYPE', 'fatal': True, 'os': 'windows', 'type': 'ERRNO_CON'}, 10042: {'desc': 'Protocol not available', 'errno-str': 'WSAENOPROTOOPT', 'fatal': True, 'os': 'windows', 'type': 'ERRNO_CON'}, 10043: {'desc': 'Protocol not supported', 'errno-str': 'WSAEPROTONOSUPPORT', 'fatal': True, 'os': 'windows', 'type': 'ERRNO_CON'}, 10044: {'desc': 'Socket type not supported', 'errno-str': 'WSAESOCKTNOSUPPORT', 'fatal': True, 'os': 'windows', 'type': 'ERRNO_CON'}, 10046: {'desc': 'Protocol family not supported', 'errno-str': 'WSAEPFNOSUPPORT', 'fatal': True, 'os': 'windows', 'type': 'ERRNO_CON'}, 10047: {'desc': 'Address family not supported by protocol', 'errno-str': 'WSAEAFNOSUPPORT', 'fatal': True, 'os': 'windows', 'type': 'ERRNO_CON'}, 10048: {'desc': 'Address already in use', 'errno-str': 'WSAEADDRINUSE', 'fatal': True, 'os': 'windows', 'type': 'ERRNO_CON'}, 10050: {'desc': 'Network is down', 'errno-str': 'WSAENETDOWN', 'fatal': True, 'os': 'windows', 'type': 'ERRNO_NET'}, 10051: {'desc': 'Network is unreachable', 'errno-str': 'WSAENETUNREACH', 'fatal': True, 'os': 'windows', 'type': 'ERRNO_NET'}, 10052: {'desc': 'Network dropped connection because of reset', 'errno-str': 'WSAENETRESET', 'fatal': False, 'os': 'windows', 'type': 'ERRNO_NET'}, 10053: {'desc': 'Software caused connection abort', 'errno-str': 'WSAECONNABORTED', 'fatal': True, 'os': 'windows', 'type': 'ERRNO_CON'}, 10054: {'desc': 'Connection reset by peer', 'errno-str': 'WSAECONNRESET', 'fatal': True, 'os': 'windows', 'type': 'ERRNO_CON'}, 10055: {'desc': 'No buffer space available', 'errno-str': 'WSAENOBUFS', 'fatal': False, 'os': 'windows', 'type': 'ERRNO_CON'}, 10056: {'desc': 'Transport endpoint is already connected', 'errno-str': 'WSAEISCONN', 'fatal': False, 'os': 'windows', 'type': 'ERRNO_CON'}, 10057: {'desc': 'Transport endpoint is not connected', 'errno-str': 'WSAENOTCONN', 'fatal': True, 'os': 'windows', 'type': 'ERRNO_CON'}, 10058: {'desc': 'Cannot send after transport endpoint shutdown', 'errno-str': 'WSAESHUTDOWN', 'fatal': True, 'os': 'windows', 'type': 'ERRNO_CON'}, 10060: {'desc': 'Connection timed out', 'errno-str': 'WSAETIMEDOUT', 'fatal': False, 'os': 'windows', 'type': 'ERRNO_CON'}, 10061: {'desc': 'Connection refused', 'errno-str': 'WSAECONNREFUSED', 'fatal': True, 'os': 'windows', 'type': 'ERRNO_CON'}, 10064: {'desc': 'Host is down', 'errno-str': 'WSAEHOSTDOWN', 'fatal': True, 'os': 'windows', 'type': 'ERRNO_NET'}, 10065: {'desc': 'No route to host', 'errno-str': 'WSAEHOSTUNREACH', 'fatal': True, 'os': 'windows', 'type': 'ERRNO_SYS'}, 10068: {'desc': 'Too many users', 'errno-str': 'WSAEUSERS', 'fatal': True, 'os': 'windows', 'type': 'ERRNO_SYS'}, 10069: {'desc': 'Quota exceeded', 'errno-str': 'WSAEDQUOT', 'fatal': True, 'os': 'windows', 'type': 'ERRNO_SYS'}}¶ dict de qualification des erreurs
-
ERRNO_NET
= 'ERRNO_NET'¶ erreur de type réseau
-
ERRNO_SEND
= 'ERRNO_SEND'¶ erreur d’envoi
-
ERRNO_SYS
= 'ERRNO_SYS'¶ erreur de type système
-
INACTIVE_COUNT
= 20¶ nombre d’erreurs à partir duquel on considère une connection comme probablement inactive
-
MSGUID_INCREMENT
= 90745¶ incrément d’uid de messages
-
NEED_CONFIRMATION
= 'NEED_CONFIRMATION'¶ indique que le message nécessite un accusé de réception
-
PING
= 'PING'¶ vérification de connection
-
RECONNECTION_DELAY
= 0.05¶ délai avant tentative de re connection
-
RECONNECTION_TIMEOUT
= 10¶ time out de reconnection (par défaut 120 sec, on le réduit)
-
REGEXP_CMD
= re.compile('\\[cmd:[A-Za-z0-9_]*\\|([A-Za-z0-9_]*=[A-Za-z0-9_\\.]*&?)*\\]')¶ Création et compilation de la regex d’interprétation des commandes
-
REGEXP_MSGUID
= re.compile('<MSGUID=[A-Za-z0-9_]*>')¶ Création et compilation de la regex des identifiants uniques de messages
-
RESEND_DELAY
= 0.05¶ délai avant nouvelle tentative d’envoi
-
SELECT_TIMEOUT
= 0.05¶ Timeout select
-
SEND_MAX_COUNT
= 15¶ nombre max de tentatives d’envoi
-
SERVER_CONNECTED
= 'SERVER_CONNECTED'¶ le serveur est connecté
-
SERVER_DISCONNECTED
= 'SERVER_DISCONNECTED'¶ le serveur se déconnecte mais ne s’arrête pas totalement
-
SERVER_SHUTDOWN
= 'SERVER_SHUTDOWN'¶ le serveur va s’arrêter
-
SET_CLIENT_READ_INFOS
= 'SET_CLIENT_READ_INFOS'¶ indique les données de connexion à client.socket_read
-
STATUS_CONNECTED
= 'STATUS_CONNECTED'¶ connection active
-
STATUS_DISCONNECTED
= 'STATUS_DISCONNECTED'¶ arrêt temporaire
-
STATUS_ERROR_CONNECTION
= 'STATUS_ERROR_CONNECTION'¶ erreur
-
STATUS_REJECTED
= 'STATUS_REJECTED'¶ connection refusée par le serveur
-
STATUS_SHUTDOWN
= 'STATUS_SHUTDOWN'¶ arrêt définiif
-
STATUS_UNDEFINED
= 'STATUS_UNDEFINED'¶ probablement en erreur
-
UID_SET_BY_SERVER
= 'UID_SET_BY_SERVER'¶ pour informer BUS/externalHandler de l’affectation
Methods Documentation
-
classmethod
create_cmd_msg
(code, kwargs=None)[source]¶ Formate un message de commande client/serveur.
Exemple d’entête ajouté :
[cmd:CODE_TEST|v1=5&v2=0.0.0.0]
-
classmethod
create_dict_receive
()[source]¶ Génère le dictionnaire non renseigné destiné à retenir les données d’une requête reçue.
dictreceive = { "requestvalide": True, # validité de la requête "AR_sended":False, # accusé de réception envoyé sans erreur "sock": None, # socket destinataire "uid": None # uid du destinataire "msg": None, # message reçu "listeparsedict": None, # liste de blocs parsés (dicts) "code_cmd": None, # code commande "dict_args": None, # ensemble de clefs/valeurs sous forme de dict "msg_except_cmd": None, # message sans code de commande ni uid de message "msguid": None, # uid de message "errors": None, # liste d'erreurs "complete": False, # indicateur de complétion }
-
classmethod
create_indexed_request
(msg, uid)[source]¶ Indexe, découpe au besoin la chaine msg envoyée par l’objet d’id uid.
- Renvoie
clef de comparaison pour AR (longueur du message), list: une liste de blocs convertis en bytes.
- Type renvoyé
msglen
-
classmethod
create_test_msg
(confirmrecept=True, latin1=True)[source]¶ Crée un message de test d’une longueur > buffsize pour forcer l’envoi de plusieurs blocs
- Paramètres
confirmrecept (bool) – ajoute le code d’accusé de réception
latin1 (bool) – limite les caractères à la plage latin-1, plage unicode complète sinon
Rq: les chars latin-1 sont codés 1 byte / char, les chars unicodes peuvent aller jusqu’à 4 bytes / char mais peuvent lever une exception lors d’un print (surrogates).
-
classmethod
get_ip
()[source]¶ Retourne l’ip primaire, à la différence de socket.gethostbyname(socket.gethostname()) qui retourne plus systématiquement 127.0.x.1
From https://stackoverflow.com/questions/166506/finding-local-ip-addresses-using-pythons-stdlib by Jamieson Becker
-
classmethod
is_error_fatal
(error)[source]¶ Indique si l’erreur reçue est fatale ou bien si l’on peut ré essayer l’action tentée.
- Paramètres
error (OSError ou autre) –
- Renvoie
False par défaut
- Type renvoyé
boolean
-
classmethod
mark_msg_as_unique
(asker, msg)[source]¶ Ajoute un identifiant unique de message à msg :
- Paramètres
asker – serveur ou client à l’origine de la demande
msg – chaine à marquer
Simplification : on ajoute la marque <MSGUID=valeur> en fin de message
-
classmethod
prefix_msg_with_code
(msg, code, kwargs=None)[source]¶ Préfixe le msg avec un entête de commande.
-
classmethod
receive_indexed_request
(sock)[source]¶ Prend en charge la réception sur la socket sock d’une série de requètes indéxées associées à un message.
Retourne le dict généré par CustomRequestHelper.create_dict_receive
-
classmethod
send_indexed_request
(sock, bytesblocs)[source]¶ Prend en charge l’envoi via la socket sock de la liste de blocs binaires listbyteblocs.
- Paramètres
bytesblocs – liste de blocs binaires générée par CustomRequestHelper.create_indexed_request
Retourne None ou la première erreur survenue sinon (dès cette première erreur le process d’envoi des blocs a été interrompu).