From 3130e592443dfad81ceac63b4af9976b9804ca21 Mon Sep 17 00:00:00 2001
From: Deomid Ryabkov <rojer@cesanta.com>
Date: Fri, 2 Nov 2018 17:31:58 +0000
Subject: [PATCH] Stop reading if connection is closing

CL: none

PUBLISHED_FROM=3b74ca02e2960bbbf130f6d95aef679f2917e824
---
 mongoose.c       | 6 ++++--
 src/mg_net.c     | 6 ++++--
 test/unit_test.c | 2 +-
 3 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/mongoose.c b/mongoose.c
index 75332c618..76f35fe34 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -2895,7 +2895,7 @@ static int mg_do_recv(struct mg_connection *nc) {
     } else {
       res = mg_recv_tcp(nc, buf, len);
     }
-  } while (res > 0);
+  } while (res > 0 && !(nc->flags & (MG_F_CLOSE_IMMEDIATELY | MG_F_UDP)));
   return res;
 }
 
@@ -3012,7 +3012,9 @@ static int mg_recv_udp(struct mg_connection *nc, char *buf, size_t len) {
       mg_hexdump_connection(nc, nc->mgr->hexdump_file, buf, n, MG_EV_RECV);
     }
 #endif
-    mg_call(nc, NULL, nc->user_data, MG_EV_RECV, &n);
+    if (n != 0) {
+      mg_call(nc, NULL, nc->user_data, MG_EV_RECV, &n);
+    }
   }
 
 out:
diff --git a/src/mg_net.c b/src/mg_net.c
index 809895c61..ebf0513f9 100644
--- a/src/mg_net.c
+++ b/src/mg_net.c
@@ -578,7 +578,7 @@ static int mg_do_recv(struct mg_connection *nc) {
     } else {
       res = mg_recv_tcp(nc, buf, len);
     }
-  } while (res > 0);
+  } while (res > 0 && !(nc->flags & (MG_F_CLOSE_IMMEDIATELY | MG_F_UDP)));
   return res;
 }
 
@@ -695,7 +695,9 @@ static int mg_recv_udp(struct mg_connection *nc, char *buf, size_t len) {
       mg_hexdump_connection(nc, nc->mgr->hexdump_file, buf, n, MG_EV_RECV);
     }
 #endif
-    mg_call(nc, NULL, nc->user_data, MG_EV_RECV, &n);
+    if (n != 0) {
+      mg_call(nc, NULL, nc->user_data, MG_EV_RECV, &n);
+    }
   }
 
 out:
diff --git a/test/unit_test.c b/test/unit_test.c
index cde8df8af..114d20f3e 100644
--- a/test/unit_test.c
+++ b/test/unit_test.c
@@ -5665,7 +5665,7 @@ static const char *test_socks(void) {
   mbuf_resize(&c->recv_mbuf, 10000000);
 
   /* Run event loop. Use more cycles to let file download complete. */
-  poll_until(&mgr, 10, c_str_ne, status, (void *) "");
+  poll_until(&mgr, 15, c_str_ne, status, (void *) "");
   ASSERT_STREQ(status, "success");
 
   mg_mgr_free(&mgr);
-- 
GitLab