]> gitweb.pimeys.fr Git - bots/basile.git/commitdiff
Mise à jour du protocole serveur -> client de la NK
authorVincent Le Gallic <legallic@crans.org>
Fri, 14 Nov 2014 22:55:10 +0000 (23:55 +0100)
committerVincent Le Gallic <legallic@crans.org>
Fri, 14 Nov 2014 22:55:10 +0000 (23:55 +0100)
nk.py

diff --git a/nk.py b/nk.py
index a9e8a5c9d923b11d27cbb596cdd9e9e015bf7a2d..7cec40aec4bcd2a15924f604ff56213a168fe17f 100644 (file)
--- a/nk.py
+++ b/nk.py
@@ -34,19 +34,25 @@ class NKUnknownError(NKError):
 class NKDeadServer(NKError):
     pass
 
 class NKDeadServer(NKError):
     pass
 
-def full_read(sock):
-    """Lit sur la socket jusqu'à ce que l'output soit déJSON-izable"""
-    output = ""
-    i = 0
-    while True:
-        output += sock.read()
-        i += 1
-        try:
-            return json.loads(output)
-        except:
-            pass
-        if i == 10 and output == "":
-            raise NKDeadServer
+def full_read(socket):
+    # On récupère d'abord la taille du message
+    length_str = ''
+    char = socket.recv(1)
+    while char != '\n':
+        length_str += char
+        char = socket.recv(1)
+    total = int(length_str)
+    # On utilise une memoryview pour recevoir les données chunk par chunk efficacement
+    view = memoryview(bytearray(total))
+    next_offset = 0
+    while total - next_offset > 0:
+        recv_size = socket.recv_into(view[next_offset:], total - next_offset)
+        next_offset += recv_size
+    try:
+        msg = json.loads(view.tobytes())
+    except (TypeError, ValueError) as e:
+        raise NKNotJson("L'objet reçu n'est pas un JSON")
+    return msg
 
 def connect():
     sock = socket.socket()
 
 def connect():
     sock = socket.socket()