gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[libmicrohttpd] 01/05: Distinguish "early response" from "error response


From: gnunet
Subject: [libmicrohttpd] 01/05: Distinguish "early response" from "error response"
Date: Sun, 31 Oct 2021 14:37:31 +0100

This is an automated email from the git hooks/post-receive script.

karlson2k pushed a commit to branch master
in repository libmicrohttpd.

commit ffbb000f890f23e14d972a6660168aff4a97b66c
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
AuthorDate: Sun Oct 31 15:40:19 2021 +0300

    Distinguish "early response" from "error response"
---
 src/microhttpd/connection.c | 26 ++++++++++++++------------
 src/microhttpd/internal.h   | 10 ++++++++--
 2 files changed, 22 insertions(+), 14 deletions(-)

diff --git a/src/microhttpd/connection.c b/src/microhttpd/connection.c
index 1792d678..e64bf8f8 100644
--- a/src/microhttpd/connection.c
+++ b/src/microhttpd/connection.c
@@ -924,6 +924,7 @@ connection_close_error (struct MHD_Connection *connection,
                         const char *emsg)
 {
   connection->stop_with_error = true;
+  connection->early_response = true;
 #ifdef HAVE_MESSAGES
   if (NULL != emsg)
     MHD_DLOG (connection->daemon,
@@ -1294,14 +1295,13 @@ keepalive_possible (struct MHD_Connection *connection)
     mhd_assert (0 == (r->flags_auto & MHD_RAF_HAS_CONNECTION_CLOSE));
     /* Valid HTTP version is enforced by 'MHD_queue_response()' */
     mhd_assert (MHD_IS_HTTP_VER_SUPPORTED (c->http_ver));
-    /* TODO: Enable assert when MHD will allow early response */
-    /* TODO: Add 'early_response' */
-    /* mhd_assert (! c->stop_with_error); */
+    mhd_assert (! c->stop_with_error);
     return MHD_CONN_MUST_UPGRADE;
   }
 #endif /* UPGRADE_SUPPORT */
 
-  if ((c->read_closed) || (c->stop_with_error))
+  mhd_assert ( (! c->stop_with_error) || (c->early_response));
+  if ((c->read_closed) || (c->early_response))
     return MHD_CONN_MUST_CLOSE;
 
   if (0 != (r->flags & MHD_RF_HTTP_1_0_COMPATIBLE_STRICT))
@@ -2256,7 +2256,7 @@ transmit_error_response_len (struct MHD_Connection 
*connection,
   struct MHD_Response *response;
   enum MHD_Result iret;
 
-  mhd_assert (! connection->stop_with_error); /* Send error one time only */
+  mhd_assert (! connection->stop_with_error); /* Do not send error twice */
   if (connection->stop_with_error)
   { /* Should not happen */
     if (MHD_CONNECTION_CLOSED > connection->state)
@@ -2265,6 +2265,7 @@ transmit_error_response_len (struct MHD_Connection 
*connection,
     return;
   }
   connection->stop_with_error = true;
+  connection->early_response = true;
 #ifdef HAVE_MESSAGES
   MHD_DLOG (connection->daemon,
             _ ("Error processing request (HTTP response code is %u ('%s')). " \
@@ -2435,7 +2436,7 @@ MHD_connection_update_event_loop_info (struct 
MHD_Connection *connection)
                                           REQUEST_TOO_BIG);
         continue;
       }
-      if (! connection->stop_with_error)
+      if (! connection->early_response)
         connection->event_loop_info = MHD_EVENT_LOOP_INFO_READ;
       else
         connection->event_loop_info = MHD_EVENT_LOOP_INFO_BLOCK;
@@ -2475,7 +2476,7 @@ MHD_connection_update_event_loop_info (struct 
MHD_Connection *connection)
         }
       }
       if ( (connection->read_buffer_offset < connection->read_buffer_size) &&
-           (! connection->stop_with_error) )
+           (! connection->early_response) )
         connection->event_loop_info = MHD_EVENT_LOOP_INFO_READ;
       else
         connection->event_loop_info = MHD_EVENT_LOOP_INFO_BLOCK;
@@ -4175,6 +4176,7 @@ connection_reset (struct MHD_Connection *connection,
     /* Reset connection to process the next request */
     size_t new_read_buf_size;
     mhd_assert (! c->stop_with_error);
+    mhd_assert (! c->early_response);
 
     if ( (NULL != d->notify_completed) &&
          (c->client_aware) )
@@ -4391,7 +4393,7 @@ MHD_connection_handle_idle (struct MHD_Connection 
*connection)
         /* we refused (no upload allowed!) */
         connection->remaining_upload_size = 0;
         /* force close, in case client still tries to upload... */
-        connection->stop_with_error = true;
+        connection->early_response = true;
       }
       connection->state = (0 == connection->remaining_upload_size)
                           ? MHD_CONNECTION_FULL_REQ_RECEIVED
@@ -4417,10 +4419,10 @@ MHD_connection_handle_idle (struct MHD_Connection 
*connection)
       if ( (0 == connection->remaining_upload_size) ||
            ( (MHD_SIZE_UNKNOWN == connection->remaining_upload_size) &&
              (0 == connection->read_buffer_offset) &&
-             (connection->stop_with_error) ) )
+             (connection->early_response) ) )
       {
         if ( (connection->have_chunked_upload) &&
-             (! connection->stop_with_error) )
+             (! connection->early_response) )
           connection->state = MHD_CONNECTION_BODY_RECEIVED;
         else
           connection->state = MHD_CONNECTION_FULL_REQ_RECEIVED;
@@ -4659,7 +4661,7 @@ MHD_connection_handle_idle (struct MHD_Connection 
*connection)
       connection_reset (connection,
                         MHD_CONN_USE_KEEPALIVE == connection->keepalive &&
                         ! connection->read_closed &&
-                        ! connection->stop_with_error);
+                        ! connection->early_response);
       continue;
     case MHD_CONNECTION_CLOSED:
       cleanup_connection (connection);
@@ -5087,7 +5089,7 @@ MHD_queue_response (struct MHD_Connection *connection,
   {
     /* response was queued "early", refuse to read body / footers or
        further requests! */
-    connection->stop_with_error = true;
+    connection->early_response = true;
     connection->state = MHD_CONNECTION_START_REPLY;
     connection->remaining_upload_size = 0;
   }
diff --git a/src/microhttpd/internal.h b/src/microhttpd/internal.h
index 28ec66e2..b2bd0f6c 100644
--- a/src/microhttpd/internal.h
+++ b/src/microhttpd/internal.h
@@ -1220,11 +1220,17 @@ struct MHD_Connection
    * The error may come from the client side (like wrong request format),
    * from the application side (like data callback returned error), or from
    * the OS side (like out-of-memory).
+   */
+  bool stop_with_error;
+
+  /**
+   * Response queued early, before the request is fully processed,
+   * the client upload is rejected.
    * The connection cannot be reused for additional requests as the current
-   * request may be incompletely read and it is unclear where is the initial
+   * request is incompletely read and it is unclear where is the initial
    * byte of the next request.
    */
-  bool stop_with_error;
+  bool early_response;
 
 #if defined(MHD_USE_POSIX_THREADS) || defined(MHD_USE_W32_THREADS)
   /**

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]