[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[libmicrohttpd] 02/05: test_client_put_stop: ensure that some data will
From: |
gnunet |
Subject: |
[libmicrohttpd] 02/05: test_client_put_stop: ensure that some data will be received by MHD before closing |
Date: |
Sun, 26 Dec 2021 10:43:03 +0100 |
This is an automated email from the git hooks/post-receive script.
karlson2k pushed a commit to branch master
in repository libmicrohttpd.
commit 005d1f25b2a8b2db5bc81f7134f3ca9e75fafa06
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
AuthorDate: Sat Dec 25 18:30:28 2021 +0300
test_client_put_stop: ensure that some data will be received by MHD before
closing
Simplified and unified code, improved readability.
---
src/microhttpd/test_client_put_stop.c | 66 ++++++++++++++++++++++++++++-------
1 file changed, 54 insertions(+), 12 deletions(-)
diff --git a/src/microhttpd/test_client_put_stop.c
b/src/microhttpd/test_client_put_stop.c
index d2629031..c1707c5c 100644
--- a/src/microhttpd/test_client_put_stop.c
+++ b/src/microhttpd/test_client_put_stop.c
@@ -1376,6 +1376,7 @@ performQueryExternal (struct MHD_Daemon *d, struct
_MHD_dumbClient *clnt)
int client_accepted;
int full_req_recieved;
int full_req_sent;
+ int some_data_recieved;
di = MHD_get_daemon_info (d, MHD_DAEMON_INFO_LISTEN_FD);
if (NULL == di)
@@ -1388,6 +1389,7 @@ performQueryExternal (struct MHD_Daemon *d, struct
_MHD_dumbClient *clnt)
_MHD_dumbClient_start_connect (clnt);
full_req_recieved = 0;
+ some_data_recieved = 0;
start = time (NULL);
do
{
@@ -1396,6 +1398,7 @@ performQueryExternal (struct MHD_Daemon *d, struct
_MHD_dumbClient *clnt)
fd_set es;
MHD_socket maxMhdSk;
int num_ready;
+ int do_client; /**< Process data in client */
maxMhdSk = MHD_INVALID_SOCKET;
FD_ZERO (&rs);
@@ -1407,6 +1410,7 @@ performQueryExternal (struct MHD_Daemon *d, struct
_MHD_dumbClient *clnt)
* processing any connections */
unsigned long long to;
full_req_sent = 1;
+ do_client = 0;
if (client_accepted && (MHD_YES != MHD_get_timeout (d, &to)))
{
ret = 0;
@@ -1416,12 +1420,36 @@ performQueryExternal (struct MHD_Daemon *d, struct
_MHD_dumbClient *clnt)
else
{
full_req_sent = _MHD_dumbClient_is_req_sent (clnt);
- if ((! full_req_sent) || full_req_recieved || (0 == rate_limiter))
+ if (! full_req_sent)
+ do_client = 1; /* Request hasn't been sent yet, send the data */
+ else
+ {
+ /* All request data has been sent.
+ * Client will close the socket as the next step. */
+ if (full_req_recieved)
+ do_client = 1; /* All data has been received by the MHD */
+ else if ((0 == rate_limiter) && some_data_recieved)
+ {
+ /* No RST rate limiter, no need to avoid extra RST
+ * and at least something was received by the MHD */
+ do_client = 1;
+ }
+ else
+ {
+ /* When rate limiter is enabled, all sent packets must be received
+ * before client close connection to avoid RST for every ACK.
+ * When rate limiter is not enabled, the MHD must receive at
+ * least something before closing the connection. */
+ do_client = 0;
+ }
+ }
+
+ if (do_client)
_MHD_dumbClient_get_fdsets (clnt, &maxMhdSk, &rs, &ws, &es);
}
if (MHD_YES != MHD_get_fdset (d, &rs, &ws, &es, &maxMhdSk))
mhdErrorExitDesc ("MHD_get_fdset() failed");
- if ((! full_req_sent) || full_req_recieved || (0 == rate_limiter))
+ if (do_client)
{
tv.tv_sec = 1;
tv.tv_usec = 250 * 1000;
@@ -1447,6 +1475,8 @@ performQueryExternal (struct MHD_Daemon *d, struct
_MHD_dumbClient *clnt)
}
if (0 == num_ready)
{ /* select() finished by timeout, looks like no more packets are pending
*/
+ if (do_client)
+ externalErrorExitDesc ("Timeout waiting for sockets");
if (full_req_sent && (! full_req_recieved))
full_req_recieved = 1;
}
@@ -1454,21 +1484,33 @@ performQueryExternal (struct MHD_Daemon *d, struct
_MHD_dumbClient *clnt)
mhdErrorExitDesc ("MHD_run_from_select() failed");
if (! client_accepted)
client_accepted = FD_ISSET (lstn_sk, &rs);
- if (NULL != clnt)
- {
- /* Do not close the socket on client side until
- * MHD is accepted and processed the socket. */
- if (! full_req_sent || (client_accepted && ! FD_ISSET (lstn_sk, &rs)))
+ else
+ { /* Client connection was already accepted by MHD */
+ if (! some_data_recieved)
{
- if ((! full_req_sent) || full_req_recieved || (0 == rate_limiter))
+ if (! do_client)
{
- /* When rate limiter is enabled, all sent packets must be received
- * before client close connection to avoid RST for every ACK. */
- if (_MHD_dumbClient_process_from_fdsets (clnt, &rs, &ws, &es))
- clnt = NULL;
+ if (0 != num_ready)
+ { /* Connection was accepted before, "ready" socket means data */
+ some_data_recieved = 1;
+ }
+ }
+ else
+ {
+ if (2 == num_ready)
+ some_data_recieved = 1;
+ else if ((1 == num_ready) &&
+ ((MHD_INVALID_SOCKET == clnt->sckt) ||
+ ! FD_ISSET (clnt->sckt, &ws)))
+ some_data_recieved = 1;
}
}
}
+ if (do_client)
+ {
+ if (_MHD_dumbClient_process_from_fdsets (clnt, &rs, &ws, &es))
+ clnt = NULL;
+ }
/* Use double timeout value here so MHD would be able to catch timeout
* internally */
} while (time (NULL) - start <= (TIMEOUTS_VAL * 2));
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.