From 3130e592443dfad81ceac63b4af9976b9804ca21 Mon Sep 17 00:00:00 2001 From: Deomid Ryabkov 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 75332c61..76f35fe3 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 809895c6..ebf0513f 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 cde8df8a..114d20f3 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);