diff --git a/src/plugins/server/server_socket.ml b/src/plugins/server/server_socket.ml
index 32c00fa522e393c8237ed557540a2a772c96645f..9162d01da30de2563be594f1a06eaaa9e036e8bd 100644
--- a/src/plugins/server/server_socket.ml
+++ b/src/plugins/server/server_socket.ml
@@ -59,11 +59,15 @@ type channel = {
 
 let feed_bytes { sock ; rcv ; brcv } =
   try
-    (* rcv buffer is only used locally *)
-    let s = Bytes.length rcv in
-    let n = Unix.read sock rcv 0 s in
-    Buffer.add_subbytes brcv rcv 0 n ;
-  with Unix.Unix_error((EAGAIN|EWOULDBLOCK),_,_) -> ()
+    while true do
+      (* rcv buffer is only used locally *)
+      let s = Bytes.length rcv in
+      let n = Unix.read sock rcv 0 s in
+      if n > 0 then
+        Buffer.add_subbytes brcv rcv 0 n
+      else raise Exit
+    done
+  with Exit | Unix.Unix_error((EAGAIN|EWOULDBLOCK),_,_) -> ()
 
 let send_bytes { sock ; snd ; bsnd } =
   try
@@ -200,7 +204,7 @@ let commands ch =
   begin
     feed_bytes ch ;
     match parse ch with
-    | [] -> None
+    | [] -> send_bytes ch ; None
     | requests -> Some Main.{ requests ; callback = callback ch }
   end