diff --git a/mongoose.c b/mongoose.c
index 7c4e691deba386fff32ed39345689b890ff0c107..75332c6186887960e149ad00e93e509c4b39ac98 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -2882,18 +2882,20 @@ static int mg_do_recv(struct mg_connection *nc) {
       ((nc->flags & MG_F_LISTENING) && !(nc->flags & MG_F_UDP))) {
     return -1;
   }
-  len = recv_avail_size(nc, len);
-  if (len == 0) return -2;
-  if (nc->recv_mbuf.size < nc->recv_mbuf.len + len) {
-    mbuf_resize(&nc->recv_mbuf, nc->recv_mbuf.len + len);
-  }
-  buf = nc->recv_mbuf.buf + nc->recv_mbuf.len;
-  len = nc->recv_mbuf.size - nc->recv_mbuf.len;
-  if (nc->flags & MG_F_UDP) {
-    res = mg_recv_udp(nc, buf, len);
-  } else {
-    res = mg_recv_tcp(nc, buf, len);
-  }
+  do {
+    len = recv_avail_size(nc, len);
+    if (len == 0) return -2;
+    if (nc->recv_mbuf.size < nc->recv_mbuf.len + len) {
+      mbuf_resize(&nc->recv_mbuf, nc->recv_mbuf.len + len);
+    }
+    buf = nc->recv_mbuf.buf + nc->recv_mbuf.len;
+    len = nc->recv_mbuf.size - nc->recv_mbuf.len;
+    if (nc->flags & MG_F_UDP) {
+      res = mg_recv_udp(nc, buf, len);
+    } else {
+      res = mg_recv_tcp(nc, buf, len);
+    }
+  } while (res > 0);
   return res;
 }
 
diff --git a/src/mg_net.c b/src/mg_net.c
index 97afe9ab56fc23576832a41220166afb7da1573d..809895c614ac0efa500234b9efeb202e5f072ae6 100644
--- a/src/mg_net.c
+++ b/src/mg_net.c
@@ -565,18 +565,20 @@ static int mg_do_recv(struct mg_connection *nc) {
       ((nc->flags & MG_F_LISTENING) && !(nc->flags & MG_F_UDP))) {
     return -1;
   }
-  len = recv_avail_size(nc, len);
-  if (len == 0) return -2;
-  if (nc->recv_mbuf.size < nc->recv_mbuf.len + len) {
-    mbuf_resize(&nc->recv_mbuf, nc->recv_mbuf.len + len);
-  }
-  buf = nc->recv_mbuf.buf + nc->recv_mbuf.len;
-  len = nc->recv_mbuf.size - nc->recv_mbuf.len;
-  if (nc->flags & MG_F_UDP) {
-    res = mg_recv_udp(nc, buf, len);
-  } else {
-    res = mg_recv_tcp(nc, buf, len);
-  }
+  do {
+    len = recv_avail_size(nc, len);
+    if (len == 0) return -2;
+    if (nc->recv_mbuf.size < nc->recv_mbuf.len + len) {
+      mbuf_resize(&nc->recv_mbuf, nc->recv_mbuf.len + len);
+    }
+    buf = nc->recv_mbuf.buf + nc->recv_mbuf.len;
+    len = nc->recv_mbuf.size - nc->recv_mbuf.len;
+    if (nc->flags & MG_F_UDP) {
+      res = mg_recv_udp(nc, buf, len);
+    } else {
+      res = mg_recv_tcp(nc, buf, len);
+    }
+  } while (res > 0);
   return res;
 }